2016-09-08 2 views
1

동적 SQL 명령에 전달 된 입력 매개 변수가 적은 저장 프로 시저를 만들었습니다. 입력 매개 변수 중 하나에 '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 값이있는 경우 어떻게 처리합니까? 하나의 Insert 문으로이 사건을 처리하고 싶습니다.

+0

1. 데이터베이스를? 2. 실제 코드가이 코드와 원격으로 비슷하다면 SQL 주입을 요구할 것입니다. 계속하기 전에 그것에 대해 읽어보십시오. –

+0

SQL에서 문자열을 조인/연결하는 중에 하나가 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

작동하지만 nullable 열에 빈 문자열을 삽입하고 싶지 않습니다. 그런대로 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