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

时间:2017-09-27 19:56:53

标签: sql-server stored-procedures common-table-expression dynamic-sql

处理存储它的存储过程会导致临时表并希望转换为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

返回以下错误:

  

Msg 203,Level 16,State 2,Line 114
  名称';与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,说明)AS

     

(SELECT CAMP_ABBR,CONVERT(VARCHAR,ORIG_CALL_DATE,101),DONOR_ID,         ACCOUNT_NUMBER_100 AS ACCOUNT_ID,COM​​PANY_NAME_100,FIRST_NAME,         LAST_NAME,TEL_AREA_CODE + TEL_PREFIX + TEL_ROOT作为电话,         STREET1,STREET2,STATE,CITY,ZIP_CODE,WAVE_NAME,         EMAIL,ORIGINAL_EMAIL,CODE1,DISPOSITIO'
  不是有效的标识符。

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

3 个答案:

答案 0 :(得分:3)

EXEC @SQL应为EXEC (@SQL);,首先应该为我提供的不是有效的标识符。

由于

答案 1 :(得分:0)

您需要将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

在此处阅读有关Common Table Expressions语法的更多信息:WITH common_table_expression

答案 2 :(得分:0)

执行局部变量但未从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

'

EXEC(@SQL)

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