我有一个服务于Web服务调用的proc。这是SQL 2012环境。 proc采用存储过程名称和任意一组过程参数(用字符串分隔符分隔)。在proc中我构建如下语句: -
INSERT INTO @Params
SELECT p.parameter_id, p.name AS ParameterName, t.name AS ParameterType, p.max_length AS ParameterLength, ''
FROM sys.parameters AS p
JOIN sys.types AS t ON t.user_type_id = p.user_type_id
WHERE object_id = OBJECT_ID(RTRIM(LTRIM(@ProcName)))
UPDATE P
SET pValue = s.data
FROM dbo.split(@ParamList,'ç') as S
INNER JOIN @Params as P ON P.id = S.ID
SELECT @ParamSplit = ISNULL(Stuff((SELECT ',' +
pName + '=' +
CASE
WHEN pValue = 'ÆNULL' THEN 'NULL'
WHEN pType = 'varchar' THEN char(39) + replace(pValue,char(39),char(39) + char(39)) + char(39)
WHEN pType = 'date' THEN char(39) + replace(pValue,char(39),char(39) + char(39)) + char(39)
WHEN pType = 'datetime' or pType='TIME' THEN char(39) + replace(pValue,char(39),char(39) + char(39)) + char(39)
else pValue
END
FROM @Params
FOR XML PATH ('')),1,1,''),'')
这很好用。我感谢并非所有数据类型都经过检查,但出于我的目的(这是一个封闭的系统),它涵盖了所有必需的基础。但是我有一个问题,因为调用服务必须传递所有参数,甚至可以在proc中默认的参数。
sys.parameters表中有一个字段
has_default_value
和另一个字段
DEFAULT_VALUE
,但检查他们的Microsoft文档 说: -
默认值仅记录在sys.parameters.default列中 用于CLR程序。对于Transact-SQL,该列将为NULL 程序参数。
我想要做的是确定我调用的proc是否有任何默认参数,如果他们这样做(并且调用服务没有通过它们)我可以使用默认值,否则这些可以被调用替换服务已经过去了。
所以......问题 - 有没有人知道如何确定proc是否分配了任何默认参数?
答案 0 :(得分:0)
您可以尝试此操作,但可能需要检查存储过程定义的格式,您可以从应用程序调用此文件并在客户端缓存以防止性能下降:
Declare @ProcedureName VARCHAR(50) = 'MySP'
DECLARE @text VARCHAR(MAX)
DECLARE @startPos int = 0
DECLARE @endPos int = 0
SELECT @text=text FROM syscomments
WHERE id = object_id(@ProcedureName) and colid=1 AND text LIKE '%(%'
IF @text IS NULL
BEGIN
-- No Parameters in stored procedure
PRINT 'No Parameters'
END
ELSE
BEGIN
-- Find Start of parameter declaration
SELECT @startPos = PATINDEX( '%(%' ,@text)
-- Find end of parameter declaration
SELECT @endPos = PATINDEX( '%AS' + CHAR(13) + '%' ,@text)
-- Set Text to our parameters string
SELECT @text = SUBSTRING(@text, @startPos + 1, @endpos - @startpos -4)
-- Split parameters and insert into table
-- Alternatively use other string splitting techniques such as numbers table
DECLARE @t1 TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX))
DECLARE @xml XML
SET @xml = N'<t>' + REPLACE(@text,',','</t><t>') + '</t>'
INSERT INTO @t1(val)
SELECT r.value('.','varchar(MAX)') as item
FROM @xml.nodes('/t') as records(r)
SELECT SUBSTRING(val, PATINDEX('%@%', val), PATINDEX('% %', val) - PATINDEX('%@%', val)) as Parm,
SUBSTRING(val, PATINDEX('%=%',val) + 1, DATALENGTH(val) - PATINDEX('%=%',val)) As DefaultValue
FROM @t1
WHERE val like '%=%' -- Only get parameters with default value
END