簡體   English   中英

SQL Server +動態查詢'列名無效'

[英]SQL Server + Dynamic Query 'Invalid Column Name'

我試圖執行以下動態查詢,但我收到一個錯誤:無效的列名稱'貓'

 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')

任何人都可以指出我的錯誤? 謝謝。

由於cat是一個varchar,你需要在它周圍加上單引號,你需要在sql字符串中放置IN子句的右括號。

新代碼將是:

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

您需要將其作為字符串傳遞給動態查詢

 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

你的字符串:

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

將評估為:

WHERE u.UserName IN (cat)

因為你所擁有的撇號只是封裝了字符串,並且字符串文字周圍沒有額外的撇號。

你需要:

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

或者,您可以保持查詢@MemberNames ,並在@MemberNames變量中使用撇號分隔每個ID:

SET @MemberName = '''cat'''           -- for a single user
SET @MemberName = '''cat'', ''dog'''  -- for multiple users

您的動態查詢使用'字符作為字符串分隔符,因此在構建字符串后,最后一行最終會像這樣讀取:

WHERE u.UserName IN (cat)

據此, cat讀起來就像一個列名。

要修復它,您需要在定義中包含轉義的'字符

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

或者在用於構建sql的字符串中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM