2016-09-08 9 views
1

私は動的SQLコマンドに渡される入力パラメータが少ないストアドプロシージャを作成しました。入力パラメータの1つに「NULL」を渡すと、動的SQL文全体がNULLになります。サンプルコードは次のとおりです。動的SQLのNULL値の処理(挿入)

DECLARE @FName VARCHAR(10); 
DECLARE @MName VARCHAR(10); 
DECLARE @LName VARCHAR(10); 
DECLARE @InsertSql VARCHAR(MAX); 

SET @FName = 'John'; 
SET @MName = NULL; 
SET @LName = 'Williams'; 

SET @InsertSql = 'INSERT INTO TestName (TestIDFirstName,TestMiddleName,TestLastName) Values (''' + @FName + ''',''' + @MName + ''',''' + @LName + ''')'; 

SELECT @InsertSql; --Returns NULL. 

入力パラメータのいずれかがNULL値の場合、どのように処理しますか?私は1つのInsertステートメントでこのケースを処理したい。

+0

1.データベースを?あなたの本当のコードがこれと遠隔的に似ているなら、あなたはかなりSQLインジェクションを求めています。続行する前にそれについてお読みください。 –

+0

SQL内でstringを結合/連結する際に、NULLがあればNULLを返します。疑わしい変数に対してISNULLまたはCOALESCEを使用してください。 – par

+0

@AlexeyRomanovは、MSSQLデータベース – bhuvana

答えて

1

使用COALESCE

SET @InsertSql = 'INSERT INTO TestName (TestIDFirstName,TestMiddleName,TestLastName) Values (''' +COALESCE(@FName,'') + ''',''' + COALESCE(@MName,'') + ''',''' + COALESCE(@LName,'') + ''')'; 
+0

ですが動作しますが、null可能な列に空の文字列を挿入したくありません。私はそのようにNULLを挿入したい。 – bhuvana

0

使用CONCATは動作します:

DECLARE @FName VARCHAR(10); 
DECLARE @MName VARCHAR(10); 
DECLARE @LName VARCHAR(10); 
DECLARE @InsertSql VARCHAR(MAX); 

SET @FName = 'John'; 
SET @MName = NULL; 
SET @LName = 'Williams'; 

SET @InsertSql = CONCAT ('INSERT INTO TestName (TestIDFirstName,TestMiddleName,TestLastName) Values (''', @FName, ''',','''', @MName, ''',''',@LName, ''')')   

SELECT @InsertSql; --Returns NULL. 
+0

concatで実行するとエラーが発生しました "メッセージ195、レベル15、状態10、行50 'CONCAT'は認識された組み込み関数名ではありません。 – bhuvana

+1

私は、 "concat"関数がSQL Server 2012に追加されたと思いますので、このバージョン以降にいる必要があります。 – Jon

関連する問題