2016-06-23 26 views
0

私は、テーブルの更新データのために、このスクリプトを得た:アップデート(検索と置換)のすべての列に、SQL Serverの

update [dbo].[temp_LABORATOR_copy] 
set [PRA] = replace([PRA], '.', ','); 
update [dbo].[temp_LABORATOR_copy] 
set [PRV] = replace([PRV], '.', ','); 
update [dbo].[temp_LABORATOR_copy] 
set [TVK] = replace([TVK], '.', ','); 
update [dbo].[temp_LABORATOR_copy] 
set [eAl] = replace([eAl], '.', ','); 
update [dbo].[temp_LABORATOR_copy] 
set [efH] = replace([efH], '.', ','); 

しかし、そこに53個の列がテーブルにある各列のためのスクリプトを一覧表示個別に非効率的です。テーブル全体に対してこのスクリプトを総合的に実行する可能性はありますか?

同様:

update [dbo].[temp_LABORATOR_copy] 
set * = NULL 
where * like '***' 
+3

すべての3つの更新文が –

+0

はなぜ 'null'なのでを設定し、行を削除しないように、同じですか? –

+0

@dns_nx - 「NULL」で列を設定しても、行全体が欲しくないというわけではありません。 –

答えて

1

その使用動的SQLのようなスクリプトを生成します。

DECLARE @tableName varchar(50) = '[dbo].[temp_LABORATOR_copy]' 
DECLARE @sql VARCHAR(MAX)=''; 

-- columns 
SELECT @sql = @sql 
    + CASE len(@sql) WHEN 0 THEN '' ELSE ',' END 
    + c.name + ' = CASE WHEN ' + c.name + ' LIKE ''***'' THEN NULL ELSE ' + c.name + ' END' 
FROM sys.columns c 
WHERE c.object_id = OBJECT_ID(@tableName) 

SET @sql = 'UPDATE ' + @tableName + ' SET ' [email protected] ; 

select @sql; 

EXECUTE (@sql); 
+0

いいね!私はちょうど列のフィルタリングを追加することを提案したい、私はOPはすべての列のデータを変更したくないと仮定します。 :) – gofr1

+1

良い点。もう1つの可能なチェックは、 'INNER JOIN sys.types y ON c.system_type_id = y.system_type_id とy.name IN( 'varchar'、 'nvarchar'、 'char'、 'nchar')のデータ型です。 – Serg

0

あなたは、動的SQLを使用することができます。

DECLARE @sql nvarchar(max) 

SELECT @sql = (
SELECT 'update [dbo].[temp_LABORATOR_copy] set [' +COLUMN_NAME+'] = replace(['+COLUMN_NAME+'], ''.'', '','');' 
FROM information_schema.columns 
WHERE TABLE_NAME = 'temp_LABORATOR_copy' 
AND COLUMN_NAME NOT IN ('Field2','Field3') -- Here put columns that must not be updated 
AND DATA_TYPE IN ('nvarchar','varchar','nchar','char') 
FOR XML PATH('') 
) 
--That will give you script like 
--update [dbo].[temp_LABORATOR_copy] set [Field1] = replace([Field1], '.', ','); and etc 

EXEC sp_executesql @sql