在游标内传递 2 个表作为参数
Pass 2 tables as parameters inside cursor
我基本上是在尝试对某些 table 的多个列执行相同的过程。我有过程和访问每一列的游标语句,但我不能将我的 tables 作为变量传递给游标:
代码:
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 '+@Table1+' t1
join '+@Table2+' 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 table 变量时遇到问题(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;
要么声明临时 table 变量并在游标内向其中插入数据,要么以某种方式将游标内已经充满临时 table 的数据传递到外部。
我最后做的是创建一个临时的 table
-- 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,如:
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 +','')
';
我基本上是在尝试对某些 table 的多个列执行相同的过程。我有过程和访问每一列的游标语句,但我不能将我的 tables 作为变量传递给游标:
代码:
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 '+@Table1+' t1
join '+@Table2+' 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 table 变量时遇到问题(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;
要么声明临时 table 变量并在游标内向其中插入数据,要么以某种方式将游标内已经充满临时 table 的数据传递到外部。
我最后做的是创建一个临时的 table
-- 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,如:
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 +','')
';