我需要一些tsql的帮助,我对sql有所了解,但主要是查询表,我发现tsql和循环很难完成。 我的IF声明已经达到了一个难点。 正如你所看到的,我编写了循环并尝试了一些调试,到目前为止代码是正确的。
在其他部分 我需要检查它是否是第一次使用@firstloop循环,然后复制所有数据,主要是我遇到问题的循环,并且可以帮助获得起点。
我正在使用游标,但已被告知它不会影响性能,因为它没有做太多的工作,我会感谢任何帮助解决问题。我也被告知有些部分是硬编码的,例如Production2应该是@Source_Database_Name。
declare @Source_Database_Name varchar(255) = 'Production2';
declare @Destination_Database_Name varchar(255) = 'c365online_script1';
declare @Company_Id int = 1 --declare a companyid
CREATE TABLE #CompanyID (ID bigint)
INSERT INTO #CompanyID(ID)
VALUES('15')
--FIRST CURSOR LOOP THROUGH THIS TABLE
CREATE TABLE #TableList (
processorder int,
tablename NVARCHAR(100)
)
INSERT INTO #TableList (processorder, tablename )
VALUES
(1, 'tProperty');
DECLARE @firstLoop BIT
--SET @firstLoop = true
DECLARE @Counter INT -- counting variable
----------- Cursor specific code starts here ------------
-- company cursor
declare copyCompanyDataCursor CURSOR fast_forward FOR
SELECT ID from #CompanyID;
open copyCompanyDataCursor
fetch next from copyCompanyDataCursor into @Company_Id;
WHILE @@FETCH_STATUS = 0
BEGIN
declare @processorder int;
declare @tablename varchar(500);
-- table cursor
declare copyTableDataCursor CURSOR fast_forward FOR
SELECT processorder,tablename from #TableList order by processorder;
open copyTableDataCursor
fetch next from copyTableDataCursor into @processorder, @tablename;
while @@FETCH_STATUS = 0
BEGIN
SET IDENTITY_INSERT [c365online_script1].[dbo].[tCompany] ON
-- Does the table have a companyID column? if statement checking for company id
IF EXISTS(SELECT * FROM Production2.INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME='CompanyID' and TABLE_NAME=@tablename)
BEGIN
declare @debug varchar(max)
SET @debug = 'INSERT INTO ' + @Destination_Database_Name + '.dbo.' + @tablename + ' SELECT * FROM ' + @Source_Database_Name + '.dbo.' + @tablename + ' WHERE ' + @Source_Database_Name + '.dbo.' + @tablename + '.CompanyID = ' + CAST(@Company_Id as varchar(10))
print @debug
--EXEC(@debug)
--EXEC('INSERT INTO ' + @Destination_Database_Name + '.dbo.' + @tablename + ' SELECT * FROM ' + @Source_Database_Name + '.dbo.' + @tablename + ' WHERE ' + @Source_Database_Name + '.dbo.' + @tablename + '.CompanyID = ' + @Company_Id )
END
ELSE
-- if no check if this is the first time through company loop and copy all data- if @firstloop company exists look at information schema
BEGIN
Print 'No'
END
-- if yes then copy data based on companyID in cursor
--EXEC('INSERT INTO ' + @Destination_Database_Name + '.dbo.' + @tablename + ' SELECT * FROM ' + @Source_Database_Name + '.dbo.' + @tablename )
-- company logic
SET IDENTITY_INSERT [c365online_script1].[dbo].[tCompany] OFF
FETCH NEXT FROM copyTableDataCursor into @processorder,@tablename;
END
close copyTableDataCursor;
Deallocate copyTableDataCursor;
答案 0 :(得分:1)
不确定您使用光标的原因。要回答你的问题“检查它是否第一次经历循环”,那么下面就是这个问题的灵魂。
在“while @@ FETCH_STATUS = 0”行上方声明一个变量。 有点像“Firsttime = 0”
在IF下,“Firsttime = 1”这意味着这不是第一次。
在ELSE中,检查 --->如果“Firsttime = 0”则表示第一次 --->如果“Firsttime = 1”那么它意味着它不是第一次