Sql 不能在CTE中浇铸
我很好奇,为什么我在像这样转换“tmp”数据项时会出现语法错误 考虑到这是可行的,但会由于数据类型不匹配而出现错误:Sql 不能在CTE中浇铸,sql,tsql,syntax,casting,sql-server-2016,Sql,Tsql,Syntax,Casting,Sql Server 2016,我很好奇,为什么我在像这样转换“tmp”数据项时会出现语法错误 考虑到这是可行的,但会由于数据类型不匹配而出现错误: ;WITH tmp(date, dataitem , data) AS ( SELECT date, LEFT(msg, CHARINDEX(';', msg + ';') - 1), STUFF(msg, 1, CHARINDEX(';', msg + ';'), '') FROM DB1
;WITH tmp(date, dataitem , data) AS
(
SELECT
date, LEFT(msg, CHARINDEX(';', msg + ';') - 1),
STUFF(msg, 1, CHARINDEX(';', msg + ';'), '')
FROM
DB1
WHERE
action LIKE 'FILE UPLOAD FTP'
AND date BETWEEN '06/01/2016' AND '07/05/2017'
UNION ALL
SELECT
date, CHARINDEX(';', data + ';'),
STUFF(data, 1, CHARINDEX(';', Data + ';'), '')
FROM
tmp
WHERE
data > ''
)
SELECT
date, dataitem,
REPLACE(SUBSTRING(dataitem, 1, CHARINDEX('|', dataitem) - 1), 'FTP UPLOAD: ', '') AS orig_file_name,
SUBSTRING(dataitem, CHARINDEX('|', dataitem) + 1, 8000) AS file_name,
(SELECT TOP 1 counts FROM DB1
WHERE action LIKE 'FILTER'
AND date> tmp.date
AND msg LIKE SUBSTRING(tmp.dataitem, CHARINDEX('|', dataitem ) + 1, 8000) + '%'
ORDER BY date) AS filter_counts,
FROM
tmp
ORDER BY
date
当然,您可以在CTE中使用
CAST
,仅在选择列表中使用,而不在列列表中使用:
WITH tmp(date, dataitem , data) AS (
SELECT date,
CAST (LEFT(msg, CHARINDEX(';',msg+';')-1) AS VARCHAR(255)),
STUFF(msg, 1, CHARINDEX(';',msg+';'), '')
FROM DB1
...
因为列名就是这样;名字。它们不会像您在查询定义中那样定义结构和类型。注意:只有在查询定义中提供了所有结果列的不同名称时,列名列表才是可选的。
WITH tmp(date, dataitem , data) AS (
SELECT date,
CAST (LEFT(msg, CHARINDEX(';',msg+';')-1) AS VARCHAR(255)),
STUFF(msg, 1, CHARINDEX(';',msg+';'), '')
FROM DB1
...