我想在每千次回傳一個用逗號格式化的值,如果它是一個數字,或者只是一個值,如果它不是一個數字我使用了以下回傳錯誤的陳述句:將 nvarchar 值“1,000”轉換為資料型別 int 時轉換失敗.
Declare @QuantityToDelete int = 1000
SELECT CASE
WHEN ISNUMERIC(@QuantityToDelete)=1
THEN format(cast(@QuantityToDelete as int),'N0')
ELSE @QuantityToDelete
END [Result]
我可以使用以下方法讓它作業
SELECT CASE
WHEN ISNUMERIC(@QuantityToDelete)=1
THEN format(cast(@QuantityToDelete as int),'N0')
ELSE cast(@QuantityToDelete as varchar)
END [Result]
結果=1,000
當陳述句的 ELSE @QuantityToDelete 部分未回傳時,為什么第一個示例不起作用?
如果我使用以下切換邏輯條件
SELECT CASE
WHEN ISNUMERIC(@QuantityToDelete)=0
THEN format(cast(@QuantityToDelete as int),'N0')
ELSE @QuantityToDelete
END [Result]
結果=1000
這是預期的,但沒有錯誤,case 陳述句仍然具有不匹配的回傳型別 nvarchar 和 int ,就像在第一個示例中一樣,只是邏輯不同?
uj5u.com熱心網友回復:
需要注意的重點是 case 運算式回傳單個標量值,并且該值具有單個資料型別。
case 運算式是固定的,它必須在運行時對該查詢進行相同的評估和作業,無論有什么資料流過查詢 - 換句話說,case 運算式的結果不能是某些行的 int 和字串其他。
請記住,查詢的結果可以被視為并用作表 - 因此就像您將列定義為特定資料型別的表一樣,您不能擁有資料型別可以不同的列對于資料行。
因此,使用 case 運算式,SQL Server 必須在編譯時確定生成的資料型別將是什么,它會使用資料型別優先級(如果需要)來確定。如果 case 運算式在不同的執行路徑中回傳了不同的資料型別,那么它將嘗試將它們隱式轉換為具有最高優先級的型別。
因此,嘗試回傳兩種不同資料型別的 case 運算式失敗,因為它試圖同時回傳nvarchar和int,而 SQL Server 將nvarchar值隱式轉換為int - 并且失敗。
第二個有效,因為您正在控制轉換,并且兩條路徑都會產生相同的varchar資料型別,它可以正常作業。
另請注意,在定義varchar時,最好也定義它的長度,因為它在這里作業時很容易自滿,因為強制轉換時默認長度為 30,否則默認長度為 1。
請參閱檔案的相關部分
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/524992.html
標籤:tsql格式案子
