【问题标题】:Stored Procedure with multi value parameter behaving strangely具有多值参数的存储过程表现异常
【发布时间】:2018-08-08 10:20:45
【问题描述】:

我在 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'.

【问题讨论】:

  • 您将通过伦敦作为直列,而不是字符串。试试 ('''+@Cities+''')
  • 您可能要考虑使用表值参数,而不是使用动态 sql。
  • 您声明的表变量将无法从动态 SQL 获得。您还需要将IN ('+@Cities+') 更改为 (IN ('''+@Cities+'''))。你怎么经过几个城市?
  • 你想达到什么目的?

标签: sql sql-server tsql stored-procedures reporting-services


【解决方案1】:

还有另一种方法可以做到这一点。为什么不使用函数拆分参数,而不是将值传递给动态查询? This articleAaron Bertrand编写的This article演示了如何在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

【讨论】:

  • 更好的选择是传入一个表值参数,但这绝对是一种可靠的方法。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-02-01
    • 2022-12-06
    • 2023-03-31
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多