的我有什麼簡單的例子:是否可以從這個動態查詢中移除遊標?
兩個表(TABLE_1和TABLE_2),其中有一個類似的列(同上),但也有幾個「有效載荷」用不同的名稱(col_1_1,col_2_1,col_2_2)列。對於不同的表格,「有效載荷」列的數量是不同的。
我有興趣從兩個表中提取ID到另一個表中所有「有效載荷」列爲空的行。
沒有爲所有表中的所有「有效載荷」欄可以使用(#TEMP)
這是它是如何用遊標完成的列表:
CREATE TABLE #temp (tab nvarchar(20) not null, col nvarchar(20) not null)
INSERT INTO #temp SELECT 'table_1','col_1_1' UNION SELECT 'table_2','col_2_1' UNION SELECT 'table_2','col_2_2'
DECLARE @table_name nvarchar(20)
DECLARE @sql nvarchar(max)
DECLARE curs CURSOR FOR (SELECT DISTINCT tab FROM #temp)
OPEN curs
FETCH NEXT FROM curs INTO @table_name
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @sql = ISNULL(@sql,'')+col+' IS NULL AND ' FROM #temp WHERE tab = @table_name
SET @sql += 'Id IS NOT NULL'
SET @sql = 'INSERT INTO #temp_master SELECT ID FROM '[email protected]_name+' WHERE '[email protected]
print @sql
SET @sql = ''
FETCH NEXT FROM curs INTO @table_name
END
CLOSE curs
DEALLOCATE curs
這是結果:
INSERT INTO #temp_master SELECT ID FROM table_1 WHERE col_1_1 IS NULL AND Id IS NOT NULL
INSERT INTO #temp_master SELECT ID FROM table_2 WHERE col_2_1 IS NULL AND col_2_2 IS NULL AND Id IS NOT NULL
是否可以刪除遊標以獲得相同的結果動態查詢?問題是,當我刪除遊標時,我無法爲不同的表使用動態「IS NULL AND」部分。
如果您想更改對象名稱(tables/databases/schemas/...),您將不得不使用動態SQL。 – mxix