【问题标题】:Assistance with IF Statement协助 IF 声明
【发布时间】:2013-10-31 12:13:15
【问题描述】:

我的 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;

【问题讨论】:

  • 你遇到什么问题。你遇到了什么问题?有什么错误吗?
  • 没有错误我只是想要一个起点来检查它是否第一次使用@firstloop循环
  • 为什么要使用游标循环?您是否尝试过纯基于集合的解决方案?
  • 我被告知要使用游标

标签: sql sql-server tsql loops count


【解决方案1】:

不确定您为什么使用光标。要回答您的“检查它是否第一次通过循环”的问题,那么下面是解决这个问题的方法。

在“while @@FETCH_STATUS = 0”行上方声明一个变量。 诸如“Firsttime = 0”之类的东西

在 IF 下,“Firsttime = 1”表示这不是第一次。

在 ELSE 中,检查 ---> if "Firsttime = 0" 则表示第一次 ---> if "Firsttime = 1" 表示不是第一次

【讨论】:

    猜你喜欢
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多