gpt4 book ai didi

sql-server - 确定 T-SQL 中 SP 参数是否具有默认值

转载 作者:行者123 更新时间:2023-12-02 10:27:06 25 4
gpt4 key购买 nike

是否有任何方法可以从 SQL Server 内部(我是 2012 年仅供引用)确定 SP 的参数是否具有默认值?有other threads对此,但是这些建议似乎并没有准确地向我提供这些信息。

以下是我尝试过的一些方法;

select *
from sys.objects so join sys.parameters sp on so.object_id = sp.object_id
where so.type='P'
and so.name = 'someSp'

上面的查询返回了一些列,听起来像是我在寻找正确的树(其中有_default_value、default_value)但是无论我是否有默认值,这些列似乎都没有变化是否在我的 SP 中。 (has_default 值始终为 0,default_value 始终为 null)

exec sp_sproc_columns 'someSp'

同样的交易;上面的 SP 返回许多列,包括 NULLABLE 和 IS_NULLABLE;无论我的 SP 内容如何,​​NULLABLE 始终等于 1 且 IS_NULLABLE = YES。

注释; SQL Server Management Studio 清楚地显示与每个 SP 参数关联的元数据。

Management Studio SP Parameter MetaData

我使用 SQL Profiler 来检查当我在 Management Studio 的对象资源管理器中查看 SP 的参数时会发生什么情况。当您展开参数文件夹时,将运行两个查询。第一个查询有点长,无法粘贴到此处(尽管如果有帮助,我会这样做)。它包含一个名为 DEFAULT VALUE 的列;但据我所知,它始终为 NULL。第二个查询只是返回 SP 的主体;大概是输出到文本编辑器窗口(尽管我担心 mgmt studio 内可能会发生一些解析!)

仅供引用/只是为了确保我不会失去理智,我创建了两个毫无意义的 Sps 只是为了测试。它们看起来像:

CREATE PROCEDURE TestDefaultSpValue_Default
@I INT = 2
AS
BEGIN
SET NOCOUNT ON;
SELECT @I
END

CREATE PROCEDURE TestDefaultSpValue_NoDefault
@I INT
AS
BEGIN
SET NOCOUNT ON;
SELECT @I
END

最佳答案

如果参数名称有“AS”符号 - 不起作用试试我的

create procedure ViewParameters
@procedure varchar(50)
as
declare
@w varchar(max),
@p int, @p2 int,
@t varchar(max)


/* Andrey Rubanko 18 jul 2013 */

/* fill temporary table with procedure body */

select @w = definition
from sys.sql_modules
where object_id = object_id(@procedure)

declare @lines table (line varchar(500), id int identity(1, 1))

while len(@w) > 0 begin
set @p = charindex(char(10), @w)
if @p > 0 begin
insert @lines(line) values(replace(replace(SUBSTRING(@w, 1, @p - 1), char(13), ''), char(9), ' '))
set @w = SUBSTRING(@w, @p + 1, 10000)
end else begin
insert @lines(line) values(replace(@w, char(13), ''))
set @w = ''
end
end



/* remove comments */

declare
@i int,
@inCommentNow bit,
@again bit

set @i = 1
set @inCommentNow = 0

while @i <= (select max(id) from @lines) begin
select @w = line from @lines where id = @i
set @again = 0

if @inCommentNow = 0 begin
set @p = patindex('%--%', @w)
if @p > 0 begin
set @w = SUBSTRING(@w, 1, @p - 1)

update @lines
set line = @w
where id = @i

end

set @p = patIndex('%/*%', @w)
if @p > 0 begin
set @p2 = PATINDEX('%*/%', @w)
if @p2 > 0 begin
update @lines
set line = substring(@w, 1, @p - 1) + SUBSTRING(@w, @p2 + 2, 10000)
where id = @i

set @again = 1
end else begin
set @inCommentNow = 1

update @lines
set line = SUBSTRING(@w, 1, @p - 1)
where id = @i
end
end
end

if @inCommentNow = 1 begin
set @p = PATINDEX('%*/%', @w)
if @p > 0 begin
update @lines
set line = SUBSTRING(@w, @p + 2, 10000)
where id = @i

set @inCommentNow = 0
set @again = 1
end else
update @lines
set line = ''
where id = @i
end

if @again = 0
set @i = @i + 1
end


/* remove all except parameters */
declare
@first int,
@last int

set @i = 1

while @last is null begin
select @w = line from @lines where id = @i

if SUBSTRING(@w, 1, 2) = 'as'
set @last = @i - 1

set @p = PATINDEX('% as%', @w)
if @last is null and @p > 0 begin
set @w = SUBSTRING(@w, 1, @p - 1)

update @lines
set line = @w
where id = @i

if charindex('@', @w) > 0
set @last = @i
else
set @last = @i - 1
end


set @p = CHARINDEX('@', @w)
if @first is null and @p > 0 begin
set @first = @i
set @w = SUBSTRING(@w, @p, 10000)
end

set @i = @i + 1
end

delete @lines
where @first is null
or id < @first
or id > @last



/* decode lines to paramters */

declare @par table (ParameterName varchar(50), ParameterType varchar(50), DefaultValue varchar(50))

declare
@name varchar(50),
@type varchar(50),
@default varchar(50)

declare c cursor for
select line
from @lines
open c
fetch next from c into @w
while @@FETCH_STATUS = 0 begin
while len(@w) > 0 begin
set @default = null

set @w = SUBSTRING(@w, charindex('@', @w) + 1, 10000)
set @p = CHARINDEX(',', @w)
print 'start:' + @w
if @p > 0 begin
set @t = SUBSTRING(@w, 1, @p - 1)
set @w = LTrim(RTrim(SUBSTRING(@w, @p + 1, 10000)))
end else begin
set @p = patindex('% as%', @w)
if @p > 0
set @t = SUBSTRING(@w, 1, @p - 1)
else
set @t = @w
set @w = ''
end

print 'T=' + @t
set @p = charindex(' ', @t)
if @p = 0
print 'NameError:' + @t + ' ->' + cast(@p as varchar)
set @name = SUBSTRING(@t, 1, @p - 1)
set @t = SUBSTRING(@t, @p + 1, 10000)

set @p = CHARINDEX('=', @t)
if @p > 0 begin
set @default = Replace(LTrim(RTrim(SUBSTRING(@t, @p + 1, 10000))), '''', '')
set @t = SUBSTRING(@t, 1, @p - 1)
end

set @p = CHARINDEX('(', @t)
if @p > 0
set @type = LTrim(RTrim(SUBSTRING(@t, 1, @p - 1)))
else
set @type = LTrim(RTrim(@t))

insert @par (ParameterName, ParameterType, DefaultValue)
values(@name, @type, @default)
end--while len(@w) > 0

fetch next from c into @w
end
close c
deallocate c

select *
from @par

关于sql-server - 确定 T-SQL 中 SP 参数是否具有默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14652361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com