2016-08-18 24 views
2

引用的標識符在作爲參數傳遞時被隱式轉換?TSQL:帶引號的標識符作爲參數投射

這似乎很奇怪,因爲它不適用於變量,並且在查詢中它們的處理方式完全不同。

CREATE PROC dbo.TestProc 
 
(
 
\t @param nvarchar(10) 
 
) 
 
AS 
 
BEGIN 
 
\t SELECT @param 
 
END 
 

 
EXEC dbo.TestProc "foo" 
 
EXEC dbo.TestProc 'foo' 
 

 
SELECT "foo" 
 
SELECT 'foo'

DECLARE @param NVARCHAR(10) = "foo" 
Invalid column name 'foo'. 
+0

提示:使用適當的軟件(MySQL,Oracle,DB2,...)和版本(例如, '的SQL服務器2014'。語法和功能的差異往往會影響答案。您尚未識別數據庫軟件。 – HABO

+0

它甚至可以在sql-server-2014沒有引用'EXEC'調用的引用,除非文字以數字開始......並且它被無聲地截斷爲作爲參數大小給出的10個nchars。錯誤與否,確定selectlist項與exec調用中的參數值不是同一種類的標記。 EBNF從未完整發布過,但這可能有所幫助:https://msdn.microsoft.com/en-us/library/ms189499.aspx與https://msdn.microsoft.com/de-de/ library/ms188332(v = sql.120).aspx – dlatikay

+0

這必須是TSQL解析器中的一個缺陷。它在這裏接受幾乎所有的字符串並將其轉換爲字符串,允許使用方括號,單引號和雙引號作爲分隔符,最令人驚訝的是,與標識符條件匹配的未加引號的字符串也以字符串結尾。沒有看到問題或如何被利用,但提出了一個錯誤。 – dlatikay

回答

0

因爲你定義@參數爲nvarchar的(10)式,其僅接受由值單引號(默認)引用,所以第二個命令(EXEC dbo.TestProc' foo')默認是正確的。如果不使用**

SET QUOTED_IDENTIFIER ON(默認情況下它是OFF)

**命令,兩個單引號(不是雙引號)是用來逃跑燎報價,如果你想使第二個exec命令有效,你必須SET QUOTED_IDENTIFIER ON,這允許使用雙引號來指定字符,這意味着「foo」可以被傳遞給nvarchar(10),並且將顯示foo(沒有任何引號)結果窗口,因爲無論使用單引號還是雙引號都可以讓sql知道哪個部分是要分配給參數的字符值

希望它有幫助xD