Sql 过程中带有值的动态参数列表

Sql 过程中带有值的动态参数列表,sql,sql-server,tsql,stored-procedures,dynamic-sql,Sql,Sql Server,Tsql,Stored Procedures,Dynamic Sql,我有很多需要5到50个参数的存储过程,我的客户机要求在SP运行时动态记录每个参数值。 目前,我们正在为每个SP手动编写代码。 我必须为此创建一些通用解决方案。但由于变量不能用于子对象或动态查询,所以看起来很困难 我想要一个参数列表,其值如下 @ID=1,@NAME='ABC',…,@STGFlag=0 CREATE PROCEDURE [dbo].[LOAD_TEST] ( @ID INT, @NAME NVARCHAR(MAX) . . . @S

我有很多需要5到50个参数的存储过程,我的客户机要求在SP运行时动态记录每个参数值。 目前,我们正在为每个SP手动编写代码。 我必须为此创建一些通用解决方案。但由于变量不能用于子对象或动态查询,所以看起来很困难

我想要一个参数列表,其值如下

@ID=1,@NAME='ABC',…,@STGFlag=0

CREATE PROCEDURE [dbo].[LOAD_TEST]
(
    @ID INT,
    @NAME NVARCHAR(MAX)
    .
    .
    .
    @STGFlag    bit
)
AS
BEGIN

    DECLARE @PARAMETERS NVARCHAR(MAX);  
    --this will be generic code in all SPs to get parameters with value.
    SELECT @PARAMETERS=[dbo].[PARAMS]( OBJECT_ID(@@PROCID))

    --EXPECTED RESULT in @PARAMETERS
    @ID=1 , @NAME='ABC' ,..., @STGFlag=0

END
我正在尝试创建一个函数,该函数可以返回一个动态查询,该查询可以由主调用方Sp运行,并且可以得到预期的结果。但我无法在动态查询中找到任何绑定变量的方法,因为即使我并没有变量的固定名称。我试图从SCHEMA.PARAMETERS的信息中获取它

ALTER FUNCTION [dbo].[PARAMS](@PROC_NAME VARCHAR(200))
RETURNS NVARCHAR(MAX) 
AS
BEGIN
        Declare     @Parameters nvarchar(max)=''
                ,   @ParamSingle nvarchar(max)
        Declare     @ParamList AS TABLE
        (
            PARAMETER_NAME varchar(max)
            ,DATA_TYPE varchar(max)
            ,ORDINAL_POSITION int
        );
        Declare @counter int=1;

        INSERT INTO @ParamList
        SELECT PARAMETER_NAME,DATA_TYPE,ORDINAL_POSITION        
        from INFORMATION_SCHEMA.PARAMETERS
        WHERE SPECIFIC_NAME=@PROC_NAME

        WHILE((select count(1) FROM @ParamList) >= @counter)
        BEGIN
            SELECT @ParamSingle = 
            CONCAT('"',PARAMETER_NAME,'="',',',
            CASE WHEN DATA_TYPE in ('int'
                                    ,'decimal'
                                    ,'smallint'
                                    ,'numeric'
                                    ,'tinyint'
                                    ,'bigint'
                                    ,'bit')
                 THEN PARAMETER_NAME
                 WHEN DATA_TYPE in ( 'varchar'
                                    ,'uniqueidentifier'
                                    ,'datetime'
                                    ,'nvarchar')
                 
                 THEN '"""",'+PARAMETER_NAME+',"""" '
                 ELSE ''
            END
            )
            FROM @ParamList WHERE ORDINAL_POSITION = @counter

            SET @Parameters = CONCAT(@Parameters, @ParamSingle,'," ,", ')
            SET @counter=@counter+1;            
        END
        SET @Parameters=REPLACE(@Parameters,'"','''');
        return concat('SELECT @PARAMETERS=CONCAT(',LEFT(@Parameters,LEN(@Parameters)-6),')');
END

您需要在某个时候对参数名称进行硬编码以获取值。也许跟踪是一个更好的解决方案。使用
FOR XML
将其作为一个大的XML blob转储到日志表中怎么样?存储过程上的50个参数听起来像是糟糕的设计。不,我不能使用XML,这是challanging的要求,而且似乎不可能实现,因为参数列表是动态的