具有多值参数的存储过程表现奇怪

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参数名称和变量相同(区分大小写)

以上是关于具有多值参数的存储过程表现奇怪的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS 中的可选多值参数

使用类型在过程的输入参数中传递多值

具有各种多值参数的 MS Query,其中可以有一个空参数

EditText表现得很奇怪

需要解释将 s-s-rS 多值参数传递给 SQL 的工作原理

使用存储过程时的参数顺序问题