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

问题描述 投票:0回答:2

我在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'.
sql sql-server tsql stored-procedures reporting-services
2个回答
1
投票

还有另一种方法可以做到这一点。而不是将值传递给动态查询,为什么不使用函数拆分参数? 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


0
投票

或者,如果您不需要使用存储过程,则可以直接将查询直接放在数据集中

SELECT ID, City
   FROM MyTables
   WHERE City IN (@Cities)

不需要动态sql,因为SSRS会为您执行此操作。只需确保SELECT语句中的SSRS参数名称和变量相同(区分大小写)

© www.soinside.com 2019 - 2024. All rights reserved.