[英]SQL query invalid column name
我有以下查询
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 ('+@category+')
ORDER BY PartnerName, Category, [Description]'
END
exec sp_executesql @sql, N'@category VARCHAR(50) ', @category
我想按类别显示以下查询的数据,这些值具有:Monitor,LCD和Desktop。 我把问题放在“哪里blablabla”
我有2个条件,我尝试过。
第一个条件 :
从我在用值声明@category时显示的代码获取错误
“无效的列名监视器”
“无效的列名LCD”
“无效的列名桌面”
第二条件 :
我为
where category IN ('''+@category+''')
如果我仅添加一个值,则它起作用,但是如果我声明@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 + ' )
谢谢
您必须从以下位置更改@category变量:
DECLARE @category VARCHAR(50) = 'monitor,LCD,Desktop'
至:
DECLARE @category VARCHAR(50) = '''monitor'',''LCD'',''Desktop'''
然后,当您在编写时在@sql中使用@category时,它也将为您工作:
where category IN ('+@category+')
谢谢@st mnmn,但是我已经解决了这个问题
我正在使用用分隔符“,”分割字符串的函数
因此,@ 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
)
在我的存储过程中:
.....................其中类别IN(从dbo.Split('','',@ category)中选择拆分)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.