[英]T-SQL Move From Test To Production Dynamically (Part 2)
好吧,自從我上一篇文章以來,我能夠取得進步!! 但是,我又遇到了另一個問題……再次:
目標:傳入兩個參數(任務和主鍵)以生成表列表。 拿清單,然后動態構造插入語句,以將數據從生產環境復制到測試環境。 換句話說,以編程方式執行“ EDIT TOP 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
在填充@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.