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;
。カーソルの列選択が機能しているので、@columnName
はMySpecificTable
にあるすべての列を反復処理しますが、カーソル内に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更新の一時テーブルを作成することでした
を –
[tag:mysql]と[tag:sql-server]は全く異なる2つの製品です。私が後者であると思われる、あなたが作業している製品にのみタグを付けてください。 –
@Damien_The_Unbelieverはい、あなたは正しいです。ありがとうございました。 –