5

次の動的クエリを実行しようとしていますが、エラーが発生しました: Invalid column name 'cat'

 DECLARE @SQLDelQuery AS NVARCHAR(1200)   
 DECLARE @MemberNames varchar(50)

 SET @MemberNames = 'cat'

      SET @SQLDelQuery = 'SELECT [Email] FROM [aspnet_Membership] am
      INNER JOIN [aspnet_Users] u
      ON (am.UserId = u.UserId)
      INNER JOIN [Member] m
      ON (am.UserId = m.UserId)
      WHERE u.UserName IN (' + @MemberNames + ')

  EXECUTE(@SQLDelQuery)

通常のクエリに変更すると、問題ありません。

SELECT [Email] FROM [aspnet_Membership] am
  INNER JOIN [aspnet_Users] u
  ON (am.UserId = u.UserId)
  INNER JOIN [Member] m
  ON (am.UserId = m.UserId)
  WHERE u.UserName IN ('cat')

誰でも私のエラーを指摘できますか? ありがとう。

4

4 に答える 4

8

は varchar であるためcat、一重引用符で囲む必要があり、IN句の閉じ括弧を SQL 文字列内に配置する必要があります。

新しいコードは次のようになります。

DECLARE @SQLDelQuery AS NVARCHAR(1200)   
 DECLARE @MemberNames varchar(50)

 SET @MemberNames = 'cat'

      SET @SQLDelQuery = 'SELECT [Email] FROM [aspnet_Membership] am
      INNER JOIN [aspnet_Users] u
      ON (am.UserId = u.UserId)
      INNER JOIN [Member] m
      ON (am.UserId = m.UserId)
      WHERE u.UserName IN (''' + @MemberNames + ''')'

  EXECUTE(@SQLDelQuery)

クエリ文字列が印刷されたSQL Fiddle Demoを参照してください。これにより、次のようなクエリ文字列が生成されます。

SELECT [Email] 
FROM [aspnet_Membership] am 
INNER JOIN [aspnet_Users] u 
  ON (am.UserId = u.UserId) 
INNER JOIN [Member] m 
  ON (am.UserId = m.UserId) 
WHERE u.UserName IN ('cat') -- cat surrounded in single quotes
于 2013-02-26T20:09:51.200 に答える
2

あなたの文字列:

WHERE u.UserName IN (' + @MemberNames + ')

は次のように評価されます:

WHERE u.UserName IN (cat)

あなたが持っているアポストロフィは文字列をカプセル化しているだけで、文字列リテラルの周りに余分なアポストロフィがないからです。

必要なもの:

WHERE u.UserName IN (''' + @MemberNames + ''')

@MemberNamesまたは、クエリをそのままにして、変数内で各 ID をアポストロフィで区切ることもできます。

SET @MemberName = '''cat'''           -- for a single user
SET @MemberName = '''cat'', ''dog'''  -- for multiple users
于 2013-02-26T20:09:42.807 に答える
2

動的クエリに文字列として渡す必要があります

 SET @MemberNames = '''cat'''

の違いresulted query

WHERE u.UserName IN (cat) -- cat is taking as a column name here
WHERE u.UserName IN ('cat') -- cat is taking as a string here
于 2013-02-26T20:10:13.613 に答える
0

動的クエリは'文字列区切り文字として文字を使用するため、文字列が構築された後、最後の行は次のようになります。

WHERE u.UserName IN (cat)

これによるとcat、列名のように読みます。

'これを修正するには、次のいずれかの定義にエスケープ文字を含める必要があります。

`SET @MemberNames = '''cat'''` 

またはSQLを構築するために使用されている文字列で:

`WHERE u.UserName IN (''' + @MemberNames + ''')'`
于 2013-02-26T20:10:20.230 に答える