2013-02-26 67 views
3

我试图执行以下动态查询,但我得到了一个错误:如果我将其更改为普通查询我无效的列名“猫”的SQL Server +动态查询“无效的列名称

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

任何人都可以指出我的错误?谢谢。

回答

5

由于cat是你需要一个varchar包括它周围的单引号,并且您需要将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 
+0

谢谢bluefeet。有效。我不能投票因为我需要50分 – 2017-05-10 08:56:50

1

您的字符串:

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

将评估为:

WHERE u.UserName IN (cat) 

因为撇号你只是封装字符串,并有字符串文字周围没有多余的撇号。

您需要:

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

或者,您可以按原样留下您的查询,并单独撇号每个ID在你@MemberNames变量:

SET @MemberName = '''cat'''   -- for a single user 
SET @MemberName = '''cat'', ''dog''' -- for multiple users 
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 
0

您的动态查询使用'字符作为字符串分隔符,因此在构建字符串后,最后一行最终会像这样读取:

WHERE u.UserName IN (cat) 

据此,cat的读取类似于列名。

要解决它,你需要在

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

或字符串,要么是定义,包括转义字符'被用来构建SQL:

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