2013-07-03 21 views
0

此鏈接是我找到問題答案的一部分的地方。SQL Server從動態查詢編寫器執行更新結果集

SQL replace all NULLs

西蒙發佈

「當老闆寫的東西,如:。

select 'update ' + table_name + ' set [' + column_name + '] = '''' where [' + column_name + '] is null' 
from tempdb.information_schema.columns 
where table_name = 'YourTableName' 

它會吐出一個大醇」查詢你 不客氣」

但我想知道是否有辦法使用參數中設置的結果並執行所有更新語句。 我想是這樣的

DECLARE @sql2 AS NVARCHAR(MAX) = N' 
SELECT ''UPDATE '' + table_name + '' SET ['' + column_name + ''] = '''''''' WHERE ['' + column_name + ''] IS NULL'' 
FROM tempdb.information_schema.columns 
WHERE table_name = ''##tempF''' 

EXEC sp_executesql @stmt = @sql2; 

DECLARE @sql3 AS NVARCHAR(MAX); 
SET @sql3 = (SELECT @sql2); 

EXEC sp_executesql @stmt = @sql3; 

但兩個結果集類似如下:

UPDATE ##tempF SET [claimid] = '' WHERE [claimid] IS NULL 
UPDATE ##tempF SET [hdr_status] = '' WHERE [hdr_status] IS NULL 
UPDATE ##tempF SET [memid] = '' WHERE [memid] IS NULL 

非常感謝大家。 乾杯! 添

回答

0

喜歡這個

--initialize variables 
DECLARE @UpdateColumns varchar(max) = '' 
DECLARE @IsNullColumns varchar(max) = '' 

SELECT 
    @UpdateColumns = @UpdateColumns + ',[' + COLUMN_NAME + '] = ISNULL([' + COLUMN_NAME + '],'''')', 
    @IsNullColumns = @IsNullColumns + ' OR [' + COLUMN_NAME + '] IS NULL' 
FROM tempdb.information_schema.columns 
WHERE table_name = '##tempF' 

這應該在兩個變量填入以下值:

@UpdateColumns = ',[claimid] = ISNULL([claimid],''''),[hdr_status] = ISNULL([hdr_status],''''),[memid] = ISNULL([memid],'''')' 
@IsNullColumns = ' OR [claimid] IS NULL OR [hdr_status] IS NULL OR [memid] IS NULL' 

然後你需要組裝所有(記住刪除每個的第一個字符的變量(STUFF函數很適合):

DECLARE @qry varchar(max) = 'UPDATE ##tempF SET ' 
+ STUFF(@UpdateColumns,1,1,'') + ' WHERE ' 
+ STUFF(@IsNullColumns,1,4,'') --the 4 in here is to get rid of ' OR ' (4 chars) 

EXEC(@qry) 
+0

Hi Tim,th e'@ qry'變量應該足以存儲所有具有varchar(max)存儲的20億個字符(如果我是正確的)。問題是當你使用PRINT(@qry)時,management studio只打印前8000個字符(或類似的東西)。如果你想查看查詢,你可以嘗試執行多個打印:'PRINT(@qry)PRINT(SUBSTRING(@ qry,8000,8000))PRINT(SUBSTRING(@ qry,16000,8000))'。如果它仍然不起作用,你可以把它包裝在一個while循環中,並在10或20列的批次中執行它 –

+0

你好Joao,我問的原因是我收到一條錯誤消息消息1038,級別15,狀態4,行2 對象或列名稱缺失或爲空。對於SELECT INTO語句,請確認每列都有一個名稱。對於其他語句,查找空的別名。別名定義爲「」或[]是不允許的。將別名更改爲有效的名稱。 –

+0

剛剛在我的回答中發現了一個錯誤,@IsNullsColumns是不正確的,請檢查編輯的答案 –