【问题标题】:Pass 2 tables as parameters inside cursor将 2 个表作为游标内的参数传递
【发布时间】:2017-08-22 06:14:02
【问题描述】:

我基本上是在尝试对某些表的多个列执行相同的过程。我有访问每一列的过程和游标语句,但我不能将表作为变量传递给游标:

代码:

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 个表变量(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;

要么声明临时表变量并将数据插入游标内,要么以某种方式传递到游标内已经充满数据的临时表之外。

【问题讨论】:

  • 这与我的问题无关..
  • mysql 和sql-server 是两个完全不同的产品。请仅标记您正在使用的产品,我怀疑是后者。
  • @Damien_The_Unbeliever 是的,你是对的。谢谢。

标签: sql-server stored-procedures cursor


【解决方案1】:

我最终做的是创建一个临时表

-- 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 +','')
    ';

【讨论】:

    猜你喜欢
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 2012-03-17
    相关资源
    最近更新 更多