2017-05-31 92 views
0

我很好奇,为什么我得到一个语法错误铸造“TMP的” 的DataItem像这样广东话投在CTE

;WITH tmp(date, CAST(dataitem AS VARCHAR(255)), 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 

考虑到这一工作,但会以不匹配的数据类型错误,由于:

;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 
+1

因为列名就是这样;名。他们没有像在查询定义中那样定义结构和类型https://technet.microsoft.com/en-us/library/ms175972(v=sql.105).aspx。注意:只有在查询定义中提供了所有结果列的不同名称时,列名列表才是可选的。 – xQbert

回答

1

你可以,当然,使用CAST在CTE,只有在SELECT列表,而不是在列列表:

WITH tmp(date, dataitem , data) AS (
    SELECT date, 
      CAST (LEFT(msg, CHARINDEX(';',msg+';')-1) AS VARCHAR(255)), 
      STUFF(msg, 1, CHARINDEX(';',msg+';'), '') 
    FROM DB1 
    ...