0

tsql の支援が必要です。SQL の知識はありますが、主にテーブルをクエリするだけで、tsql とループを終了するのが非常に難しいと感じています。IF ステートメントで問題が発生しました。ご覧のとおり、ループを作成してデバッグを試みましたが、これまでのところコードは正しいです。

Else セクションでは、 @firstloop を使用してループを初めて通過するかどうかを確認し、すべての data をコピーする必要があります。これは主に、問題があり、開始点を取得するのに役立つループです。

私はカーソルを使用していますが、あまり多くの作業を行っていないため、パフォーマンスに影響を与えないと言われています。また、@Source_Database_Name である必要がある Production2 など、一部のセクションがハードコードされているとも言われています。 .

 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;
4

1 に答える 1

1

カーソルを使用している理由がわかりません。「初めてループを通過したかどうかを確認する」という質問に答えるために、以下はこれに対するソウルリューションです。

「while @@FETCH_STATUS = 0」行より上に変数を宣言します。「初めて= 0」のようなもの

IF の下で、「初回 = 1」は、これが初回ではないことを意味します。

ELSE で、チェック ---> "Firsttime = 0 " の場合は初回を意味します ---> "Firsttime = 1 " の場合は初回ではないことを意味します

于 2013-10-31T12:32:41.207 に答える