2012-05-03 54 views
0

我下面的查询SQL查询无效的列名

DECLARE @category VARCHAR(50) = 'monitor,LCD,Desktop' 
DECLARE @sql nvarchar(4000) 

IF @category IS NOT NULL 
BEGIN 
SELECT @sql = 'SELECT *, 
CASE 
    WHEN Aging > 90 THEN ''> 90'' 
    ELSE 
     CASE 
      WHEN Aging > 60 THEN ''61-90'' 
      ELSE 
       CASE 
        WHEN Aging > 30 THEN ''31-60'' 
        ELSE ''<=30'' 
       END 
     END 
END AS AgingCat, Pct*100 AS Percentage FROM dbo.vwPartnerProductAging 

where category IN ('[email protected]+') 
ORDER BY PartnerName, Category, [Description]' 

END 

exec sp_executesql @sql, N'@category VARCHAR(50) ', @category 

我希望显示来自以下按类别查询其中有值的数据:显示器,液晶显示器和桌面。而我的问题在“WHERE blablabla”

我有2个条件我试了。

第一条件

从代码表明当我声明@Category与值其得到错误

“无效列名监视器”

“无效列名LCD”

“无效的列名称桌面”

秒条件

我为

where category IN ('''[email protected]+''') 

改变它的工作原理,如果我只添加一个值,但如果我宣布@Category有多个值其没有显示任何东西,但没有错误


如果我把值直接放在“WHERE blablabla”它工作正常。

工作条件

DECLARE @category VARCHAR(50) = 'monitor,LCD,Desktop' 
DECLARE @sql nvarchar(4000) 

IF @category IS NOT NULL 
BEGIN 
SELECT @sql = 'SELECT *, 
CASE 
    WHEN Aging > 90 THEN ''> 90'' 
    ELSE 
     CASE 
      WHEN Aging > 60 THEN ''61-90'' 
      ELSE 
       CASE 
        WHEN Aging > 30 THEN ''31-60'' 
        ELSE ''<=30'' 
       END 
     END 
END AS AgingCat, Pct*100 AS Percentage FROM dbo.vwPartnerProductAging 

where category IN (''Monitor'',''LCD'',''Desktop'') 
ORDER BY PartnerName, Category, [Description]' 

END 

exec sp_executesql @sql, N'@category VARCHAR(50) ', @category 

我想改变:

where category IN (''Monitor'',''LCD'',''Desktop'') 

到:

where category IN (' + @category + ') 

感谢

+0

可能重复的[参数化SQL IN子句?](http://stackoverflow.com/questions/337704/parameterizing-an-sql-in-clause) – Pondlife

回答

0

感谢@st mnmn但我不得不解决这个问题

我使用与separato分割字符串函数ř字符 “”

所以对于@Category输入必须有分离器的值 “”

例如输入

@category= 'LCD,Monitor,Desktop' 

我使用功能:

FUNCTION [dbo].[Split] (@sep char(1), @s varchar(2000)) 
RETURNS table 
AS 
RETURN (
WITH Pieces(pn, start, stop) AS (
    SELECT 1, 1, CHARINDEX(@sep, @s) 
    UNION ALL 
    SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1) 
    FROM Pieces 
    WHERE stop > 0 
) 
SELECT pn, 
    SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS split 
FROM Pieces 

和在我店里的程序URE:

............... 其中类别中(从 dbo.Split选择分裂( '', '',@类别))

0

你^ h AVE您@Category变量从改变:

DECLARE @category VARCHAR(50) = 'monitor,LCD,Desktop' 

到:

DECLARE @category VARCHAR(50) = '''monitor'',''LCD'',''Desktop''' 

,然后它会为你工作,也当您使用@Category在@sql,你写道:

where category IN ('[email protected]+') 
+0

谢谢,但我已经解决了这个问题...我发布的答案,由方式如果我使用哪里类别IN('+ @ category +')。值@category必须先在我的应用程序中进行转换,我尝试了这种方式,并且获得了更多时间。所以我的解决方案是在调用应用程序中的值之前在sql中进行转换。 – tyo