2017-05-31 90 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 
    ...