2016-06-28 53 views
1

以下查詢將返回60行,我如何在一次性使用存儲過程中執行語句。使用存儲過程執行動態查詢結果

SELECT 'UPDATE TEMP1 
SET ' + COLUMN_NAME + '= 0' + ' WHERE '+COLUMN_NAME+ ' IS NULL' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'TEMP1' AND DATA_TYPE = 'FLOAT' 
AND COLUMN_NAME NOT IN('Sales','Net_Margin'); 
+1

我用tsql替換了plsql標記。 PL/SQL適用於Oracle。 –

回答

1

下面是做到這一點的一種方法:

DECLARE @Sql nvarchar(max) = '' 

SELECT @Sql = @Sql + 'UPDATE TEMP1 
SET ' + COLUMN_NAME + '= 0' + ' 
WHERE '+COLUMN_NAME+ ' IS NULL; 
' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'TEMP1' AND DATA_TYPE = 'FLOAT' 
AND COLUMN_NAME NOT IN('Sales','Net_Margin'); 

PRINT @Sql -- remark this row once you check the sql and unremark the next one to execute 

--EXEC(@Sql) 
1

嘗試添加一個分號到您的查詢或GO關鍵字,做像下面

declare @sql nvarchar(max) 
    set @sql = 
    (SELECT 'UPDATE TEMP1 
     SET ' + COLUMN_NAME + '= 0' + ' WHERE '+COLUMN_NAME+ ' IS NULL' 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'TEMP1' AND DATA_TYPE = 'FLOAT' 
     AND COLUMN_NAME NOT IN('Sales','Net_Margin');) 

exec(@Sql) 
print @sql 
+0

你錯過了where條款的條件... –

+0

@ZoharPeled:謝謝,我正在測試,所以刪除它.will現在更新 – TheGameiswar

1

起初創建SP:

CREATE PROCEDURE SPName 
    @table_name sysname, 
    @data_type sysname 
AS 
BEGIN 
    DECLARE @sql nvarchar(max) 

    SELECT @sql = @sql + 'UPDATE TEMP1 SET ' + COLUMN_NAME + '= 0' + ' WHERE '+COLUMN_NAME+ ' IS NULL;' 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = @table_name AND DATA_TYPE = @data_type 
    AND COLUMN_NAME NOT IN('Sales','Net_Margin') 

    EXEC sp_execute @sql 

END 

然後ex ecute:

EXEC SPName 'TEMP1', 'FLOAT' 
相關問題