有人可以幫助我了解以下錯誤的詳細資訊嗎?這適用于 SQL Server 2008。
我自己修復了它,發現許多搜索結果顯示相同的修復,但沒有人解釋為什么會在 CTE 中發生這種情況。
遞回查詢“CTE”的“txt”列中的錨點和遞回部分之間的型別不匹配。
這是我用 CAST 解決問題的示例,但為什么它會起作用?
WITH CTE(n, txt) AS
(
--SELECT 1, '1' --This does not work.
--SELECT 1, CAST('1' AS varchar) --This does not work.
--SELECT 1, CAST('1' AS varchar(1000)) --This does not work.
SELECT
1,
CAST('1' AS varchar(max)) --This works. Why?
UNION ALL
SELECT
n 1,
txt ', ' CAST(n 1 AS varchar) --Why is (max) NOT needed?
FROM
CTE
WHERE
n < 10
)
SELECT *
FROM CTE
我假設有一些我不理解的默認變數型別在起作用,例如:
- 類似的型別是什么
SELECT 'Hello world!? - 字串連接運算子的型別是什么
SELECT 'A' 'B'? - 數學的型別是
SELECT n 1什么?
uj5u.com熱心網友回復:
您想要的資訊都在檔案中:
連接兩個 char、varchar、binary 或 varbinary 運算式時,結果運算式的長度是兩個源運算式長度之和,最多 8,000 個位元組。
剪...
使用 、 或 比較相同資料型別但長度不同的兩個運算式時
UNION,EXCEPT結果INTERSECT長度是兩個運算式中較長的一個。此外,數字資料型別的精度和小數位數
decimal是固定的。當算術運算子有兩個相同型別的運算式時,結果具有相同的資料型別,并具有為該型別定義的精度和小數位數。
但是,遞回 CTE與普通CTE 不同UNION ALL:
遞回成員中某一列的資料型別必須與錨成員中對應列的資料型別相同。
因此,在回答您的問題時:
'Hello world!'默認具有資料型別varchar(12)。'A' 'B'具有資料型別varchar(2),因為這是被求和的兩種資料型別的總和長度(實際值不相關)。n 1仍然是一個int- 在遞回 CTE 中,資料型別必須完全匹配,
'1'a 也是如此varchar(1)。如果您varchar在 a 中指定沒有長度,CAST那么您會得到varchar(30),所以txt ', ' CAST(n 1 AS varchar)也是varchar(33)。
當您將錨部分轉換為 時varchar(max),這將自動意味著遞回部分也將是varchar(max)。您不需要轉換為max,您也可以將遞回部分直接轉換varchar(30)為例如:
WITH CTE(n, txt) AS
(
--SELECT 1, '1' --This does not work.
SELECT 1, CAST('1' AS varchar(30)) --This does work.
--SELECT 1, CAST('1' AS varchar(1000)) --This does not work.
UNION ALL
SELECT
n 1,
CAST(CONCAT(txt, ', ', n 1) AS varchar(30))
FROM
CTE
WHERE
n < 10
)
SELECT *
FROM CTE
db<>小提琴
uj5u.com熱心網友回復:
如果將查詢放入字串中,則可以像查詢一樣獲得結果集資料型別:
DECLARE @query nvarchar(max) = 'SELECT * FROM table_name';
EXEC sp_describe_first_result_set @query, NULL, 0;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/431794.html
上一篇:避免從其他表中選擇資料
下一篇:在表中添加不同的計數列
