Sql 过程中带有值的动态参数列表
我有很多需要5到50个参数的存储过程,我的客户机要求在SP运行时动态记录每个参数值。 目前,我们正在为每个SP手动编写代码。 我必须为此创建一些通用解决方案。但由于变量不能用于子对象或动态查询,所以看起来很困难 我想要一个参数列表,其值如下 @ID=1,@NAME='ABC',…,@STGFlag=0Sql 过程中带有值的动态参数列表,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
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的要求,而且似乎不可能实现,因为参数列表是动态的