繁体   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