0

我有一个 SP 会返回下一个代码。我将传递 TableName、IdentityColumnName、CodeColumn 和 ConditionColumn。很简单,我想将动态查询结果保存在一个变量中,这个查询将返回一个值给我。该 SP 将适用于 3 张桌子。问题是我的动态查询没有设置为@query变量,任何帮助。

  ALTER PROC [dbo].[usp_GetNextCode]
    (
        @IdColumnName nvarchar(20)= 'HeadId',                
        @CodeColumnName nvarchar(100)= 'HeadCode',           
        @TableName nvarchar(50)= 'Head',                     
        @MaxColumnName varchar(50) = 'FamilyId',             
        @MaxColumnValue varchar(3) = 1                       
    )
    AS
    BEGIN
        DECLARE @query varchar(max) , @NewId VARCHAR(30),@LastCode varchar(30)
        ---First Get the Last Inserted Code and save it in a Variable..
        SET @query =    'Select      '+ @LastCode +'='+ @CodeColumnName +'
                        FROM         Account.' + @TableName 
                     + ' Where '    + @IdColumnName + ' = (
                                    SELECT      MAX(' + @IdColumnName + '  ) 
                                    FROM        Account.' + @TableName +'  
                                    where       '+ @MaxColumnName  + ' = ' + @MaxColumnValue  +' )'
        Select @query
        EXEC(@query)
        Select @LastCode
    END
4

1 回答 1

1

您需要使用sp_executesql,因为您希望/需要为动态查询使用输出参数:

ALTER PROC [dbo].[usp_GetNextCode]
(
    @IdColumnName nvarchar(20)= 'HeadId',                
    @CodeColumnName nvarchar(100)= 'HeadCode',           
    @TableName nvarchar(50)= 'Head',                     
    @MaxColumnName varchar(50) = 'FamilyId',             
    @MaxColumnValue varchar(3) = 1
)
AS
BEGIN

        DECLARE @query nvarchar(max) , @NewId VARCHAR(30),@LastCode varchar(30)
        DECLARE @parms nvarchar(max)
        ---First Get the Last Inserted Code and save it in a Variable..
        SET @query =    'Select      @LastCode='+ @CodeColumnName +'
                        FROM         Account.' + @TableName 
                     + ' Where '    + @IdColumnName + ' = (
                                    SELECT      MAX(' + @IdColumnName + '  ) 
                                    FROM        Account.' + @TableName +'  
                                    where       '+ @MaxColumnName  + ' = ' + @MaxColumnValue  +' )'
        SET @parms = '@LastCode varchar(30) output'
        Select @query
        EXEC sp_executesql @query,@parms,@LastCode output
        Select @LastCode
END

目前,您正在将 的连接到@LastCode您的@query字符串中 - 因为它是NULL,所以您的整个@query字符串变为NULL.

于 2013-04-17T06:17:33.493 回答