4

そこにあるcsvファイルからインポートされたデータベーステーブルがあるNULLので、フィールドがNULLではなくインポートされたときに、文字列値が含まれます'NULL'

CSVファイルは、テキストエディタで開いてすべてを編集するには大きすぎるNULLため、テーブルの各列を更新するSQLクエリを作成しようとしています。

これまでのところ私はこれを持っています

Alter PROCEDURE [dbo].[sp_fixnulls]
     @column nvarchar(100) 
AS
BEGIN
     SET NOCOUNT ON;
     UPDATE my_table
     SET @column=''
     WHERE @column = 'NULL'
END 

---------------

sp_fixnulls (SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME  ='my_table')

しかし、これは機能していません。エラーメッセージが表示されます

メッセージ201、レベル16、状態4、プロシージャsp_fixnulls、行0
プロシージャまたは関数'sp_fixnulls'には、指定されていないパラメータ'@column'が必要です。

4

2 に答える 2

8

@columnは変数です。その内容をSQLに動的にスワップアウトすることはできません。これを実現するには、TSQLを使用する必要があります。これにより、SQLを文字列に生成してから実行します。そのような:

DECLARE @sql VARCHAR(MAX)
SET @sql = '
UPDATE my_table
SET ' + @column + '=''''
WHERE ' + @column + ' = ''NULL''
'

EXEC (@sql) -- don't forget the parentheses

私のコードが列を空の文字列に設定していることに注意してください。これはNULLと同じではありません。私はあなたの既存の例で行きました。NULLが必要な場合は、

SET ' + @column + '= NULL
于 2013-01-24T21:52:52.227 に答える
5

'メッセージ201、レベル16、状態4、プロシージャsp_fixnulls、行0プロシージャまたは関数' sp_fixnulls'には、指定されていないパラメータ'@column'が必要です。

発生するエラーは、selectステートメントをパラメーターとしてストアード・プロシージャーに渡そうとしているためです。1つの列の名前だけをストアドプロシージャに渡すと、そのエラーを回避できます。

そうすれば、別のエラーは発生しませんが、希望する結果は得られません。Eliが推奨するようにストアドプロシージャを修正すると(コメントしたように@sql、ステートメントの前後に括弧を追加して)、機能します。EXEC

次に、ストアドプロシージャをカーソルでラップする必要があります(ほとんどの人はお勧めしませんが、必要に応じて機能します)。または、すべての列名を選択して一連の実行ステートメントを生成してから、ステートメントを実行することもできます。

SELECT 'EXECUTE sp_fixnulls N''' + column_name + ''';'
        FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'my_table';

これにより、次のようなステートメントが生成されます(テーブルに列、、、およびがあると仮定しidますnamedate

EXECUTE sp_fixnulls N'id';
EXECUTE sp_fixnulls N'name';
EXECUTE sp_fixnulls N'date';

もう1つのオプションは、ストアドプロシージャを完全に放棄することです。

SELECT 'UPDATE my_table SET ' + column_name
        + ' = NULL WHERE ' + column_name + ' = ''NULL'';'
        FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'my_table';

これにより、次のようなステートメントが生成されます。

UPDATE my_table SET id = NULL WHERE id = 'NULL';
UPDATE my_table SET name = NULL WHERE name = 'NULL';
UPDATE my_table SET date = NULL WHERE date = 'NULL';
于 2013-01-24T22:56:40.590 に答える