Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL从测试动态迁移到生产(第2部分)_Sql_Sql Server_Tsql - Fatal编程技术网

T-SQL从测试动态迁移到生产(第2部分)

T-SQL从测试动态迁移到生产(第2部分),sql,sql-server,tsql,Sql,Sql Server,Tsql,好吧,自从我上一次,我能够取得进步!!然而,我又遇到了另一个问题……再一次: 目标:传入两个参数(任务和主键)以生成表列表。获取列表,然后动态构造insert语句,目的是将数据从生产环境复制到测试环境。换句话说,以编程方式完成“编辑前200名”的工作……但速度要快得多 问题(已更新):@tmpInserVars没有在每次迭代中更新。它在第一次输入代码时设置,并且从不刷新 迄今为止: USE MAINDB DECLARE @PK int = 1000, @TaskName nvarchar(50

好吧,自从我上一次,我能够取得进步!!然而,我又遇到了另一个问题……再一次:

目标:传入两个参数(任务和主键)以生成表列表。获取列表,然后动态构造insert语句,目的是将数据从生产环境复制到测试环境。换句话说,以编程方式完成“编辑前200名”的工作……但速度要快得多

问题(已更新):@tmpInserVars没有在每次迭代中更新。它在第一次输入代码时设置,并且从不刷新

迄今为止:

USE MAINDB
DECLARE @PK int = 1000,
 @TaskName nvarchar(50) = 'TASK', 
 @curTable nvarchar(75),
 @curRow nvarchar(75),
 @tmpStatement nvarchar(500),
 @tmpInsert nvarchar(500)

RAISERROR('Retrieving Tables',0,1) WITH NOWAIT
 DECLARE TableCursor CURSOR LOCAL FOR 

    SELECT DISTINCT TOP 2 PRMPTTBL.tTable as PromptTable
       FROM THING1 TK INNER JOIN THING2 SC ON TK.tkNo=SC.tkNo
              INNER JOIN Component EL on EL.scNo=SC.scNo             
              LEFT OUTER JOIN Field FLD1 on FLD1.cfNo=EL.cfNoPrompt1            
              LEFT OUTER JOIN MyTableTable MTTTBL on MTTTBL.tbNo=FLD1.tbNo

       WHERE EL.PK=@PK
              AND (MTTTBL.tTable is not NULL AND MTTTBL.tTable not in('OneTableIDontWant'))
              AND MTTTBL.tTable not like '%[_]d%' --eliminate any tables that are actually views
              AND EL.cfNo > 0  
              AND TK.Description like @TaskName

RAISERROR('Table',0,1) WITH NOWAIT
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @curTable
WHILE @@FETCH_STATUS = 0
BEGIN
   SET @tmpStatement = 'SELECT TOP 5 * FROM [MYCONN].TEST_MYDB.dbo.' + @curTable + ' where PK=' + Cast(@PK as nvarchar(10))
   EXEC (@tmpStatement)
   RAISERROR(N'Table (outside): %s',0,1,@curTable) WITH NOWAIT  

   IF @@ROWCOUNT = 0 
   BEGIN
        --@tmpInsertVars isn't updating!!!
        RAISERROR(N'Initial Select: %s',0,1,@tmpStatement) WITH NOWAIT
        SELECT @tmpInsertVars = COALESCE(@tmpInsertVars + ',','') + COLUMN_NAME 
        FROM PRODDB.INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = @curTable

        SET @tmpInsertStatement = 'INSERT INTO [MYCONN].TEST_MYDB.dbo.' + @curTable + ' (' + @tmpInsertVars + ')' +
                                  ' SELECT TOP 500 ' + @tmpInsertVars +
                                  ' FROM TEST_MYDB.' + @curTable +
                                  ' WHERE PK=' + Cast(@PK as nvarchar(10))

        RAISERROR(N'Insert Statement: %s',0,1,@tmpInsertStatement) WITH NOWAIT
   END


   FETCH NEXT FROM TableCursor INTO @curTable
END

CLOSE TableCursor
DEALLOCATE TableCursor
  • 声明@tmpInsertStatement和@tmpInsertVars变量
  • 在填充@tmpInsertVars之前将其重置为NULL

    USE MAINDB
    DECLARE @PK int = 1000,
     @TaskName nvarchar(50) = 'TASK', 
     @curTable nvarchar(75),
     @curRow nvarchar(75),
     @tmpStatement nvarchar(500),
     @tmpInsert nvarchar(500),
     @tmpInsertStatement nvarchar(500),
     @tmpInsertVars nvarchar(500)
    
    RAISERROR('Retrieving Tables',0,1) WITH NOWAIT
     DECLARE TableCursor CURSOR LOCAL FOR 
    
        SELECT DISTINCT TOP 2 PRMPTTBL.tTable as PromptTable
           FROM THING1 TK INNER JOIN THING2 SC ON TK.tkNo=SC.tkNo
                  INNER JOIN Component EL on EL.scNo=SC.scNo             
                  LEFT OUTER JOIN Field FLD1 on FLD1.cfNo=EL.cfNoPrompt1            
                  LEFT OUTER JOIN MyTableTable MTTTBL on MTTTBL.tbNo=FLD1.tbNo
    
           WHERE EL.PK=@PK
                  AND (MTTTBL.tTable is not NULL AND MTTTBL.tTable not in('OneTableIDontWant'))
                  AND MTTTBL.tTable not like '%[_]d%' --eliminate any tables that are actually views
                  AND EL.cfNo > 0  
                  AND TK.Description like @TaskName
    
    RAISERROR('Table',0,1) WITH NOWAIT
    OPEN TableCursor
    FETCH NEXT FROM TableCursor INTO @curTable
    WHILE @@FETCH_STATUS = 0
    BEGIN
       SET @tmpStatement = 'SELECT TOP 5 * FROM [MYCONN].TEST_MYDB.dbo.' + @curTable + ' where PK=' + Cast(@PK as nvarchar(10))
       EXEC (@tmpStatement)
       RAISERROR(N'Table (outside): %s',0,1,@curTable) WITH NOWAIT  
    
       IF @@ROWCOUNT = 0 
       BEGIN
            --@tmpInsertVars isn't updating!!!
            SELECT @tmpInsertVars = NULL; -- RESET @tmpInsertVars
            RAISERROR(N'Initial Select: %s',0,1,@tmpStatement) WITH NOWAIT
            SELECT @tmpInsertVars = COALESCE(@tmpInsertVars + ',','') + COLUMN_NAME 
            FROM PRODDB.INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME = @curTable
    
            SET @tmpInsertStatement = 'INSERT INTO [MYCONN].TEST_MYDB.dbo.' + @curTable + ' (' + @tmpInsertVars + ')' +
                                      ' SELECT TOP 500 ' + @tmpInsertVars +
                                      ' FROM TEST_MYDB.' + @curTable +
                                      ' WHERE PK=' + Cast(@PK as nvarchar(10))
    
            RAISERROR(N'Insert Statement: %s',0,1,@tmpInsertStatement) WITH NOWAIT
       END
    
    
       FETCH NEXT FROM TableCursor INTO @curTable
    END
    
    CLOSE TableCursor
    DEALLOCATE TableCursor
    

  • 哇!非常感谢你!!你介意告诉我为什么这样做吗?对我来说,我认为“SELECT@tmpInsertVars=COALESCE(---)”是在每次迭代时重新分配值,但情况显然不是这样。tmpInsertVars变量将继续在后续循环中保留其值,因为赋值语句只是附加到它。COALESCE只接受在其参数中找到的第一个非空值。在每个后续循环中,它仍然具有上一次迭代中的非null值,因此COALESCE语句中的第一个参数将起作用,以保留现有数据并开始追加更多数据。通过在合并之前将tmpInsertVars重置回NULL,您可以确保第一个参数/表达式将为NULL,因为(NULL+,')=NULL。很好的解释!非常感谢。