2017-01-18 1 views
2

다음 동적 쿼리를 실행하려고하는데 동적 쿼리를이 쿼리에 전달했습니다.동적 쿼리에 null 값을 전달하는 방법

DECLARE @TABLE TABLE(ID INT,NAME VARCHAR(10)) 
INSERT INTO @TABLE 
SELECT 1,'A' 
UNION 
SELECT 2,'B' 
UNION 
SELECT 3,NULL 

DECLARE @NAME VARCHAR(20)=NULL, 
     @SQL VARCHAR(MAX) 
     SET @SQL='SELECT * 
        FROM @TABLE 
        WHERE NAME='''[email protected]+'''' 
PRINT @SQL 

그러나 결과 나 오류가 표시되지 않습니다. 누구든지이 문제를 정렬 할 수 있습니다.

+0

모든 값이 NULL 인 연락처가 여전히 NULL이기 때문에 ISNULL을 @Name에 사용할 수 있습니다. –

+0

왜 동적 SQL이 있습니까? –

+0

의도적으로 NULL 값을 쿼리에 전달하거나 쿼리가 실패한 이유가 궁금한 경우 명확히하십시오. NULL을 전달하고자 할 경우, '='연산자를 사용하여 NULL 비교를해서는 안되기 때문에 문자열을 수정해야합니다. – DK5

답변

0

NULL을 문자열과 연결할 때 항상 NULL 만 얻을 수 있습니다. 여기서 변수 @NAME이 NULL이므로 @SQL도 NULL입니다.

@NAME이 NULL 일 때 ISNULL 함수를 사용하여 기본값을 할당 할 수 있습니다.

SET @SQL='SELECT * 
      FROM @TABLE 
      WHERE ISNULL(NAME,'''')='''+ISNULL(@NAME,'')+'''' 

그러나 쿼리의 또 다른 문제는, 당신은 당신이 쿼리를 실행할 때 오류가 발생, 동적 SQL 내부 @Table_Variable를 추가 할 수 없습니다,하지만 당신은 여기 #Temp_tables를 사용할 수 있습니다.

0

스크립트

1) 당신은 NULL로 변수 @Name을 설정 두 가지 문제가 있습니다. 이제 NULL을 VARCHAR 변수와 연결하면 결과는 NULL 문자열이됩니다. SELECT 문을 포함하는 변수 @SQL이 @Name과 연결되면 NULL이되고 EXECUTE와 함께 사용하면 대답이 반환되지 않습니다.

2) EXECUTE 문의 범위를 벗어나는 테이블 변수를 선언하고 있습니다.

변수의 값이 전달되는 경우에 당신이 @Name 변수로하고 시도 된 같은 문자열, 값와 연결
  1. 가의 일부가 : 동적 SQL에 변수를 사용하는 경우, 그들은이 될 필요가

    SELECT 'ABC'; 
    
    1. 다른 : 대신 변수 DECLARE @Name VARCHAR(20) = 'ABC'; EXEC('SELECT ''' + @Name + ''';');

    위의 문장의 문자열은 다음 SQL 동등한를 실행합니다 동적 SQL 문 내에서 변수를 변수로 사용하는 방법은 해당 변수를 동적 SQL 내에서만 선언하는 것입니다. 그렇지 않으면 변수가 동적 SQL 내에서 인식되지 않고 SQL 문자열을 실행할 때 변수 선언되지 않은 오류가 발생합니다. 명령문을 실행할 때 알 수 있듯이 SQL은 내부에서 테이블 변수 @Table을 인식하지 못합니다. 이에 대한 해결 방법은 동적 SQL 문자열 내부의 @Table 변수를 선언하고 거기에 초기화 : DECLARE @NAME VARCHAR(20)=NULL, @SQL VARCHAR(MAX); SET @SQL='DECLARE @TABLE TABLE(ID INT,NAME VARCHAR(10)) INSERT INTO @TABLE SELECT 1,''A'' UNION SELECT 2,''B'' UNION SELECT 3,NULL; SELECT * FROM @TABLE WHERE NAME='''[email protected]+'''';

기억해야 할 한 가지 중요한 점은 동적 SQL 문자열이에서 별도의 일괄 적으로 실행됩니다한다는 것입니다 그것이 불린 하나. 즉, 동적 SQL 문자열 내에 @Table 변수를 선언하면 동적 SQL 문자열의 기간 및 범위에만 존재하며 그 이후에는 존재하지 않습니다. @Table 변수가 더 이상 존재하지 않으므로 @Table 변수에 대한 변경 사항은 동적 SQL 문 다음에 존재하지 않습니다. 비슷하게 SQL 문자열 외부에 @Table 변수를 선언하면 동적 @SQL 배치에서 사용되지 않습니다.

0

EXEC 문에서 테이블 변수에 액세스 할 수 없습니다.테이블 변수는 연결 범위에 따라 다르기 때문에 그리고 Exec 문은 다른 세션 (연결)에서 코드를 실행합니다.

그래서 그 대신 당신이 오히려 함께 문자열을 연결보다는 임시 테이블 (#)

CREATE TABLE #TABLE (ID INT,NAME VARCHAR(10)) 
INSERT INTO #TABLE 
SELECT 1,'A' 
UNION 
SELECT 2,'B' 
UNION 
SELECT 3,NULL 

DECLARE @NAME VARCHAR(20)=NULL, 
     @SQL VARCHAR(MAX) 
     SET @SQL='SELECT * 
        FROM #TABLE 
        WHERE NAME ' 
SELECT @SQL = @SQL + CASE WHEN @NAME IS NULL THEN 'IS NULL' ELSE '='''[email protected]+'''' END 
PRINT @SQL 
0

을 사용할 수 있습니다, 나도 문자열 값으로 @NAME 변수를 대체하는 일련의 문을 추가하거나 NULL입니다.

DECLARE @TABLE TABLE(ID INT,NAME VARCHAR(10)) 
INSERT INTO @TABLE 
SELECT 1,'A' 
UNION 
SELECT 2,'B' 
UNION 
SELECT 3,NULL 

DECLARE @NAME VARCHAR(20)=NULL, 
     @SQL VARCHAR(MAX) 
     SET @SQL='SELECT * 
        FROM @TABLE 
        WHERE NAME [NAME]' 
set @SQL = replace(@SQL, '[NAME]', isnull('= ''' + @NAME + '''', 'IS NULL')) 
print @SQL 
관련 문제