2010-08-11 4 views
0

SQL 문을 실행하는 중 문제가 발생합니다. 이것은 Northwind db입니다. (수정)WITH 문을 사용한 후 SQL exec 실행 오류가 발생했습니다.

declare @PageIndex int 
    declare @PageSize int 
    declare @PageLowerBound int 
    declare @PageUpperBound int 
    declare @sql nvarchar(4000) 

    select @PageIndex = 3 
    select @PageSize = 5 

    SET @PageLowerBound = @PageSize * @PageIndex 
    SET @PageUpperBound = @PageLowerBound + @PageSize + 1 
    with cts 
    as 
    (
    SELECT * 
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS ROW,* FROM Orders) 
    AS Orders WHERE ROW >[email protected] AND Row<[email protected] 
    ) 
    select @sql = @sql + 'select * from cte' 
    exec (@sql) 

그냥 * 제가 사용을 선택, 약간의 수정 CTE에서, 나는 실수로 잘못된 코드를 붙여 넣습니다. 죄송합니다. 사실, @sql에 where 절을 추가하고 실행하려고 시도하지만 "exec '키워드 근처에 구문이 잘못되었습니다."라는 오류 메시지가 표시됩니다. 내가 뭘 잘못 했니? 감사합니다.

+1

이 이해가되지 않는다 - 당신이 ' CTE를 정의했지만이를 사용하지는 않습니다. –

+0

userN이 CTE를 'select from from orders'를 사용하여 동적으로 사용하려한다고 생각합니다 ... – StuartLC

+0

@ user417633 : WHERE 절을 수정하여 행 페이지 범위에 무언가를 추가하려고합니까? –

답변

2

(예 : here과 같이) 표준 CTE 호출 패턴을 만들고 붙여 넣은 WHERE 절에 대해 동적으로 만들려고합니다.

하기이

+0

나는 CTE를 SQL 문자열에 포함 할 필요가 없다고 생각했다. 그래서 나는 더 적은 고통과 함께 절을 추가 할 수 있습니다 ... 그것은 더 이상 "WITH"문을 사용하여 의미가없는 cte 문자열을 추가해야 할 것 같습니다 .... – user417633

+0

@ user417633 실제로 그것은 CTE를 정의하고, 당신은 여전히 ​​그것을 첨부하여 그것을 사용해야합니다. – JonH

+0

OMG 조랑말은 아래에 있습니다 ... 그냥 cte는 cts라고합니다;) – StuartLC

1

세미 콜론이 있어야합니다. CTS가 있어야합니다. CTE를 표현할 때 세미 콜론이 필요합니다 (바로 앞에 있습니다).

SET @PageUpperBound = @PageLowerBound + @PageSize + 1 
    ;with cts 
    as 
    (
    SELECT * 
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS ROW,* FROM Orders) 
    AS Orders WHERE ROW >[email protected] AND Row<[email protected] 
    ) 
    select @sql = @sql + 'select * from orders' 
    exec (@sql) 

CTE도 사용하지 않았으므로 왜 사용 했습니까?

1

은 당신이 결국 볼 것은 :

Common table expression defined but not used. 

가 바로 다음 문에서 CTE를 소비하거나 전혀 생성하지 않습니다.

다른 느린 문제는 예를 여기있다 :

select @sql = NULL + 'select * from orders' 

가 NULL 할당 및 변수의 값은 항상 NULL입니다 보장합니다

select @sql = @sql + 'select * from orders' 

이 효과적으로 동일합니다.

코드를 흐리게 처리했지만 해당 동적 SQL을 실행하기 전에 @sql에 실제로 NULL이 아닌 값이 있는지 확인하십시오.

동적 SQL은 자체 범위에서 실행되며 CTE 또는 다른 변수에 대한 참조가 없음을 기억하십시오.

1

당신은 사용할 필요가 달성하기 위해 SQL 문자열 (임원 또는 sp_executesql을)에 CTE를 추가해야합니다 AFAIK :

DECLARE @sql NVARCHAR(4000) 

    SET @sql = 'with cts as (
        SELECT * 
        FROM (SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS ROW, 
            o.* 
          FROM ORDERS o) AS Orders 
        WHERE ROW >= @PageLowerBound 
         AND Row <= @PageUpperBound) 
       SELECT * 
        FROM cte ' 

BEGIN 

    EXEC sp_executesql @sql, N'@PageLowerBound INT, @PageUpperBound INT', 
          @PageLowerBound, @PageUpperBound 

END 
관련 문제