简体   繁体   English

T-SQL动态地从测试过渡到生产(第2部分)

[英]T-SQL Move From Test To Production Dynamically (Part 2)

Alright, since my previous post , I was able to make progress!! 好吧,自从我上一篇文章以来,我能够取得进步!! However, I've run into another problem...once again: 但是,我又遇到了另一个问题……再次:

GOAL: Pass in two parameters (a task and a primary key) to generate a list of tables. 目标:传入两个参数(任务和主键)以生成表列表。 Take the list, and then dynamically construct insert statements with the aim to copy data from a production environment to a test environment. 拿清单,然后动态构造插入语句,以将数据从生产环境复制到测试环境。 In other words, do programmatically what 'EDIT TOP 200' does...but a lot faster. 换句话说,以编程方式执行“ EDIT TOP 200”的操作...但是要快得多。

PROBLEM (UPDATED): @tmpInserVars isn't updating with each iteration. 问题(已更新):@tmpInserVars并非每次迭代都更新。 It gets set the first time the code is entered, and never refreshes. 它是在第一次输入代码时设置的,永远不会刷新。

Thus far: 迄今:

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
  1. Declare your @tmpInsertStatement and @tmpInsertVars variables. 声明您的@tmpInsertStatement和@tmpInsertVars变量。
  2. Reset @tmpInsertVars to NULL just before you populate it 在填充@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 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM