2016-08-18 13 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-server-2014'です。構文と機能の相違は、しばしば答えに影響します。データベースソフトウェアを特定していません。 – HABO

+0

リテラルが数値数字で始まっていない限り、sql-server-2014の 'EXEC'コールで引用符を使わなくてもうまく動作し、paramサイズとして与えられた10 ncharsに自動的に切り捨てられます。バグかどうかは、選択リスト項目が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)と@paramを定義したためにのみ(デフォルトでは)一重引用符で引用された値を受け入れ、どのタイプなので、2番目のコマンド(EXEC dbo.TestProc " foo ')はデフォルトで正しいです。 **

SET QUOTED_IDENTIFIER ON(デフォルトではオフです)

**コマンドを使用せずに、2つの単一引用符(未二重引用符)は、あなたがしたい場合は、焦がす引用符をエスケープするために使用されている場合2番目のexecコマンドを動作させるには、QUOTED_IDENTIFIERをONにする必要があります。これは、二重引用符を使用して文字を指定することができます。つまり、 "foo"がnvarchar(10)に渡され、foo(引用符なし)一重引用符または二重引用符を使用して、その部分がパラメータに割り当てる文字値であることをSQLに認識させるため、結果ウィンドウ。

希望するxD