在 CTE 中不是有效的标识符 T SQL Dynamic SQL

Not a valid Identifier T SQL Dynamic SQL inside a CTE

处理存储它的存储过程导致临时 table 并希望转换为 CTE。

代码:

DECLARE  @SQL nVARCHAR(max)

SET @SQL = '
;with CTE_RESULT 
(
        CAMP_ABBR,
        ORIG_CALL_DATE,
        DONOR_ID,
        ACCOUNT_NUMBER_100,
        COMPANY_NAME_100,
        FIRST_NAME,
        LAST_NAME,
        PHONE,
        STREET1,
        STREET2,
        STATE,
        CITY,
        ZIP_CODE,
        WAVE_NAME,
        EMAIL,
        ORIGINAL_EMAIL,
        CODE1,
        DISPOSITION_CODE,
        DESCRIPTION 
)AS

(
SELECT  CAMP_ABBR,
        CONVERT(VARCHAR,ORIG_CALL_DATE,101),
        DONOR_ID,
        ACCOUNT_NUMBER_100 AS ACCOUNT_ID,
        COMPANY_NAME_100,
        FIRST_NAME,
        LAST_NAME,
        TEL_AREA_CODE + TEL_PREFIX + TEL_ROOT AS PHONE,
        STREET1,
        STREET2,
        STATE,
        CITY,
        ZIP_CODE,
        WAVE_NAME,
        EMAIL,
        ORIGINAL_EMAIL,
        CODE1,
        R.DISPOSITION_CODE,
        D.DESCRIPTION 
FROM placeholder1 t1
WHERE COLUMN IN(''01'',''02''))
'

EXEC @SQL

Returns 出现如下错误:

Msg 203, Level 16, State 2, Line 114
The name ' ;with CTE_RESULT (CAMP_ABBR, ORIG_CALL_DATE, DONOR_ID, ACCOUNT_NUMBER_100, COMPANY_NAME_100, FIRST_NAME, LAST_NAME, PHONE, STREET1, STREET2, STATE, CITY, ZIP_CODE, WAVE_NAME, EMAIL, ORIGINAL_EMAIL, CODE1, DISPOSITION_CODE, DESCRIPTION) AS

( SELECT CAMP_ABBR, CONVERT(VARCHAR,ORIG_CALL_DATE,101), DONOR_ID, ACCOUNT_NUMBER_100 AS ACCOUNT_ID, COMPANY_NAME_100, FIRST_NAME, LAST_NAME, TEL_AREA_CODE + TEL_PREFIX + TEL_ROOT AS PHONE, STREET1, STREET2, STATE, CITY, ZIP_CODE, WAVE_NAME, EMAIL, ORIGINAL_EMAIL, CODE1, DISPOSITIO'
is not a valid identifier.

看起来它已达到局部变量的 varchar 限制,但我不知道是什么原因。

EXEC @SQL 应该是 EXEC (@SQL); 第一个给我的不是有效的标识符。

谢谢

您需要将 AS 关键字移动到更靠近 WITH 的位置,并且您需要像这样重新格式化查询:

;with CTE_RESULT AS -- NOTE: AS moved here
(
    SELECT
        CAMP_ABBR,
        ORIG_CALL_DATE,
        DONOR_ID,
        ACCOUNT_NUMBER_100,
        COMPANY_NAME_100,
        FIRST_NAME,
        LAST_NAME,
        PHONE,
        STREET1,
        STREET2,
        STATE,
        CITY,
        ZIP_CODE,
        WAVE_NAME,
        EMAIL,
        ORIGINAL_EMAIL,
        CODE1,
        DISPOSITION_CODE,
        DESCRIPTION
    FROM placeholder1 t1
    WHERE COLUMN IN(''01'',''02'')
) -- AS -- this AS here should be causing the error.
SELECT * FROM CTE_RESULT

在此处阅读有关常见 Table 表达式语法的更多信息:WITH common_table_expression

正在执行局部变量,但未从 select 修复的 CTE select 从局部变量中填充的 CTE 中执行。 :

DECLARE @STARTDATE DATETIME,
        @ENDDATE DATETIME,
        @SQL nVARCHAR(max)

SET @SQL = '
;with CTE_RESULT  
(
        CAMP_ABBR,
        ORIG_CALL_DATE,
        DONOR_ID,
        ACCOUNT_NUMBER_100,
        COMPANY_NAME_100,
        FIRST_NAME,
        LAST_NAME,
        PHONE,
        STREET1,
        STREET2,
        STATE,
        CITY,
        ZIP_CODE,
        WAVE_NAME,
        EMAIL,
        ORIGINAL_EMAIL,
        CODE1,
        DISPOSITION_CODE,
        DESCRIPTION 
)
AS
(
SELECT  M.CAMP_ABBR,
        CONVERT(VARCHAR,ORIG_CALL_DATE,101),
        DONOR_ID,
        ACCOUNT_NUMBER_100 AS ACCOUNT_ID,
        COMPANY_NAME_100,
        FIRST_NAME,
        LAST_NAME,
        TEL_AREA_CODE + TEL_PREFIX + TEL_ROOT AS PHONE,
        STREET1,
        STREET2,
        STATE,
        CITY,
        ZIP_CODE,
        WAVE_NAME,
        EMAIL,
        ORIGINAL_EMAIL,
        CODE1,
        R.DISPOSITION_CODE,
        D.DESCRIPTION 
FROM CMSPRD18.CAMP.DBO.GHIL0001_MAS M
LEFT JOIN CMSPRD18.CAMP.DBO.GHIL0001_RES R
ON M.UNIQUE_NUMBER = R.UNIQUE_NUMBER
JOIN [ADMIN].[DBO].[CAMPAIGN] C 
ON M.CAMP_ABBR = C.CAMP_ABBR
JOIN [ADMIN].[DBO].DISPOSITION D 
ON C.CAMP_ID = D.CAMP_ID
AND R.DISPOSITION_CODE = D.DISPOSITION_CODE
WHERE R.DISPOSITION_CODE IN(''01'',''02''))

SELECT * 
FROM CTE_RESULT

'

执行 (@SQL)

这就是我想要通过转换实现的目标。