具有多值参数的存储过程表现奇怪
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有多值参数的存储过程表现奇怪相关的知识,希望对你有一定的参考价值。
我在sql server中创建了一个存储过程来提供SSRS以允许它接受多个值。我已创建它,当我在我的报告中使用它或在sql server中执行它时,我有以下错误消息。有什么我想念的吗?谢谢
Msg 207, Level 16, State 1, Line 35
Invalid column name 'London'.
这是我的样本数据。随意用它创建表
DECLARE @MyTables AS TABLE (ID INT, City VARCHAR(100))
INSERT INTO @MyTables VALUES
(1,'London'),
(2,'Chester'),
(3,'Luton'),
(4,'New York'),
(1,'London'),
(2,'Chester'),
(5,'Paris'),
(5,'Paris'),
(2,'Chester'),
(2,'Chester')
SELECT * FROM @MyTables
这是我的动态存储过程的代码
CREATE PROCEDURE dbo.CitiesGroup
@Cities NVARCHAR(Max) -- this are the parameters
AS
BEGIN
DECLARE @sqLQuery VARCHAR(MAX)
Declare @AnswersTempTable Table
( ID INT,
City VARCHAR(250)
)
SET @sqlQuery =
'SELECT
ID,
City
FROM MyTables
where Convert(nvarchar(Max),City) IN ('+@Cities+')
Insert into @AnswersTempTable
exec (@sqlQuery)
select * from @AnswersTempTable'
END
谢谢
EXEC dbo.CitiesGroup 'London'
错了
Msg 207, Level 16, State 1, Line 32
Invalid column name 'London'.
答案
还有另一种方法可以做到这一点。而不是将值传递给动态查询,为什么不使用函数拆分参数? This article编写的Aaron Bertrand演示了如何在sql server中拆分字符串的不同方法。
选择其中一个函数后,您只需重写存储过程,而无需在其中创建动态查询。
CREATE PROCEDURE dbo.CitiesGroup
@Cities NVARCHAR(Max) -- this are the parameters
AS
BEGIN
-- simplified query
-- write your complex logic here
SELECT ID, City
FROM MyTables
WHERE City IN (SELECT Item FROM dbo.SplitStrings_CTE(@Cities, N',');)
END
用法:
EXEC dbo.CitiesGroup 'London'
GO
EXEC dbo.CitiesGroup 'London,New York,Paris'
GO
有用的链接:
Split strings the right way – or the next best way
另一答案
或者,如果您不需要使用存储过程,则可以直接将查询直接放在数据集中
SELECT ID, City
FROM MyTables
WHERE City IN (@Cities)
不需要动态sql,因为SSRS会为您执行此操作。只需确保SELECT语句中的SSRS参数名称和变量相同(区分大小写)
以上是关于具有多值参数的存储过程表现奇怪的主要内容,如果未能解决你的问题,请参考以下文章