【问题标题】:Stored Procedure: Passing a parameter when using dynamic SQL for pivoting data存储过程:使用动态 SQL 进行数据透视时传递参数
【发布时间】:2016-05-23 13:52:41
【问题描述】:

正如标题所示,我正在尝试使用动态 SQL 来获取透视表的列名 - 但是,我也希望能够将参数传递给名为 @assessments 的变量,但我似乎无法让它工作。以下是我正在使用的代码,如果有人可以看一下并让我知道我哪里出错了,我将不胜感激。谢谢

    create PROCEDURE [dbo].[spTestExamResults]

    AS
    BEGIN

        DECLARE @SQL as NVARCHAR(MAX)
        DECLARE @ColumnName as NVARCHAR(MAX)
        DECLARE @assessment as NVARCHAR(50)

        SET NOCOUNT ON;

    --Get distinct values from pivot source

    SELECT @ColumnName = ISNULL(@ColumnName + ',','') + QUOTENAME(subjectname)

    From (SELECT DISTINCT SubjectName From qryPupilNCTest) as p order by p.Subjectname

    SET @SQL = 
    'select pupil,PupilName, year' + @ColumnName + '
    FROM qrypupilnctest
    Where assessment in (' + @assessment + ')
    PIVOT (MAX(grade) for subjectname in (' +@ColumnName + ')) piv'


    EXEC (@SQL)

    END

【问题讨论】:

  • 什么不起作用?你有错误吗?结果不正确?
  • 您希望@assessment 作为参数而不是局部变量?你的问题不清楚!
  • 按照编码,这将永远不会返回任何内容,因为您的评估变量尚未分配值,因此您的 sql 变量为 NULL。

标签: sql-server string parameter-passing dynamic-sql


【解决方案1】:

在您的情况下,@assessment 是没有任何初始化并在操作中处理的局部变量。所以它总是只有空值,你不会从存储过程中得到任何结果。

根据您的帖子标题,您可以更改存储过程并将@assessment 作为参数传递,因此WHERE assessment IN ( 将包含一些有效数据并且您将收到一些有效结果。

ALTER PROCEDURE [dbo].[spTestExamResults]
(
  @assessment   NVARCHAR(50)
)
AS
BEGIN

    DECLARE @SQL AS NVARCHAR(MAX)
    DECLARE @ColumnName AS NVARCHAR(MAX)
    -- DECLARE @assessment as NVARCHAR(50)  -- Remove the @assessment from the local variable 

    SET NOCOUNT ON;

    --Get distinct values from pivot source
    SELECT @ColumnName = ISNULL(@ColumnName + ',','') + QUOTENAME(subjectname)
    FROM (SELECT DISTINCT SubjectName FROM qryPupilNCTest) AS p 
    ORDER BY p.Subjectname

    SET @SQL = 'SELECT pupil, PupilName, year' + @ColumnName + '
    FROM qrypupilnctest
    WHERE assessment IN (' + @assessment + ')
    PIVOT (MAX(grade) FOR subjectname IN (' + @ColumnName + ')) piv'

    EXEC (@SQL)

END

所以执行调用将是:

EXEC [dbo].[spTestExamResults] 'paramvalue1, paramvalue2'

【讨论】:

  • 抱歉,问题不清楚 - 我正在执行存储过程但没有返回任何结果,正如 Sean Lange 指出的那样。然而,Arulkumar 的回应让我意识到这是把它放在错误的地方的一个例子——一旦我把它放在它应该放在的地方,它就完美地工作了。我是 SQL 的相对新手,所以我游得很远。非常感谢大家的帮助,特别感谢 Arulkumar!
猜你喜欢
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
相关资源
最近更新 更多