在 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)
这就是我想要通过转换实现的目标。
处理存储它的存储过程导致临时 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)
这就是我想要通过转换实现的目标。