2017-08-22 7 views
0

私は基本的に同じプロシージャをいくつかのテーブルの複数のカラムで実行しようとしています。私は手順、および各列にアクセスするカーソル文がありますが、私は、変数としてカーソルに私のテーブルを渡すことはできません。カーソル内のパラメータとして2つのテーブルを渡す

コード:私は、この手順が機能することができますどのよう

DECLARE @columnName varchar(200), 
@Table1 TABLE(
     [Code] [nvarchar](50) NOT NULL, 
     [Name] [nvarchar](255) NOT NULL, 
     [Value1] [nvarchar](50) NOT NULL, 
     [Value2] [nvarchar](50) NOT NULL, 
     [Value3] [nvarchar](50) NOT NULL 
    ), 
@Table2 TABLE(
     [Code] [nvarchar](50) NOT NULL, 
     [Name] [nvarchar](255) NOT NULL, 
     [Value1] [nvarchar](50) NOT NULL 
     [Value2] [nvarchar](50) NOT NULL, 
     [Value3] [nvarchar](50) NOT NULL 
    ) 
INSERT @Table1 EXEC ProcedureThatAddsData; 
INSERT @Table2 EXEC ProcedureThatAddsData; 
DECLARE col_cursor CURSOR FOR 

select c.name from sys.tables t inner join sys.columns c on t.object_id = c.object_id where t.name = 'MySpecificTable' 

OPEN col_cursor 

FETCH NEXT FROM col_cursor 
INTO @columnName 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT @columnName 
    --BEGIN BODY 
    DECLARE @sql nvarchar(4000) 


    set @sql = ' 
    INSERT INTO MySavedDifferencesTable 
    select t1.Code, t1.Name, t1.'+ @columnName +' as OldValue, t2.'+ @columnName +' as NewValue 
    from '[email protected]+' t1 
    join '[email protected]able2+' t2 
     on t1.Code = t2.Code 
     and t1.Name = t2.Name 
     WHERE ISNULL(t1.' + @columnName +','') != ISNULL(t2.' + @columnName +','') 
    '; 
    exec (@sql) 



    --end BODY 
    FETCH NEXT FROM col_cursor 
    INTO @columnName 
END 
CLOSE col_cursor; 
DEALLOCATE col_cursor; 

。カーソルの列選択が機能しているので、@columnNameMySpecificTableにあるすべての列を反復処理しますが、カーソル内に2つのテーブル変数を渡すのに問題があります(forループ?)。

編集:

これは私が私のカーソルに追加しようとしている部分です:

@Table1 TABLE(
      [Code] [nvarchar](50) NOT NULL, 
      [Name] [nvarchar](255) NOT NULL, 
      [Value1] [nvarchar](50) NOT NULL, 
      [Value2] [nvarchar](50) NOT NULL, 
      [Value3] [nvarchar](50) NOT NULL 
     ), 
    @Table2 TABLE(
      [Code] [nvarchar](50) NOT NULL, 
      [Name] [nvarchar](255) NOT NULL, 
      [Value1] [nvarchar](50) NOT NULL 
      [Value2] [nvarchar](50) NOT NULL, 
      [Value3] [nvarchar](50) NOT NULL 
     ) 
    INSERT @Table1 EXEC ProcedureThatAddsData; 
    INSERT @Table2 EXEC ProcedureThatAddsData; 

は、一時テーブル変数を宣言し、カーソル内のそれらにデータを挿入する、または何らかの形で外部に渡すのどちらかカーソル内に既にデータ一時表がいっぱいです。

私がやってしまったことは

-- check if temporary table already exists 
    -- if not create it 
    IF OBJECT_ID('tempdb..#MyTempTable') IS NULL 
    begin 
    --table with same columns as snapshot table to insert current data 
    --MyTempTable 
     CREATE TABLE #MyTempTable(
     [Code] [nvarchar](50) NOT NULL,.. 
    ) 
    end 

    --remove old data if it exists from the temporary MyTempTable table 
    delete from #MyTempTable; 
    --insert the current data into the temporary MyTempTable table 
    INSERT #SSDEStudySpecific EXEC procThatinsertsData; 

そして今、私は次のように私のカーソルの内部で実行されますSQL更新の一時テーブルを作成することでした

+0

を –

+0

[tag:mysql]と[tag:sql-server]は全く異なる2つの製品です。私が後者であると思われる、あなたが作業している製品にのみタグを付けてください。 –

+0

@Damien_The_Unbelieverはい、あなたは正しいです。ありがとうございました。 –

答えて

0

:私とは何の関係もありません

set @sql = ' 
    INSERT INTO MySavedDifferencesTable 
    select t1.Code, t1.Name, t1.'+ @columnName +' as OldValue, t2.'+ @columnName +' as NewValue 
    from '+#MyTempTable1+' t1 
    join SomeSystemTable t2 
     on t1.Code = t2.Code 
     and t1.Name = t2.Name 
     WHERE ISNULL(t1.' + @columnName +','') != ISNULL(t2.' + @columnName +','') 
    '; 
関連する問題