处理存储它的存储过程会导致临时表并希望转换为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,COMPANY_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限制,但我不知道原因是什么。
答案 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)
这是我想通过转换实现的目标。