powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Необязательные параметры в ХП
22 сообщений из 22, страница 1 из 1
Необязательные параметры в ХП
    #36600678
Добрый день!

Господа, подскажите плз, можно ли узнать каким-то запросом или еще как - какие параметры передаваемые процедуре обязательные, а у каких есть дефолтовые значения?

Вот почитал про таблицу syscolumns, там вроде все есть, а вот признака такого нет :(
А есть ли вообще где-нибудь такая информация?
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #36600703
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос по ХП,

а при чем тут syscolumns? Вам sysparameters нужно.
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #36600717
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iljy, sys.parameters почему-то врет. для всех записей has_default_value = 0 и собсно default_value - NULL
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #36600723
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL Server only maintains default values for CLR objects in this catalog view; therefore, this column has a value of 0 for Transact-SQL objects. To view the default value of a parameter in a Transact-SQL object, query the definition column of the sys.sql_modules catalog view, or use the OBJECT_DEFINITION system function.

ясно
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #36600724
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakilliljy, sys.parameters почему-то врет. для всех записей has_default_value = 0 и собсно default_value - NULL
BOL
SQL Server only maintains default values for CLR objects in this catalog view; therefore, this column has a value of 0 for Transact-SQL objects.
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #36600752
iljyВопрос по ХП,

а при чем тут syscolumns? Вам sysparameters нужно.

а если сервер 2000, то что это за таблица?
запрос:
Код: plaintext
1.
2.
3.
select *
from sysobjects
where name like '%sysparameters%'
ничего не выдал... туплю?
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #36600757
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос по ХП,

хотя не, у вас же судя по названию 2000? Тогда там такого еще нет.
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #36600760
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос по ХПiljyВопрос по ХП,

а при чем тут syscolumns? Вам sysparameters нужно.

а если сервер 2000, то что это за таблица?
запрос:
Код: plaintext
1.
2.
3.
select *
from sysobjects
where name like '%sysparameters%'
ничего не выдал... туплю?
нет, там такого не было.
вот например тред http://education.sqlfarms.com/education/ShowPost.aspx?PostID=277
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #36600763
iljyВопрос по ХП,

хотя не, у вас же судя по названию 2000? Тогда там такого еще нет.

Т.е. в 2000 сервере нельзя никак определить является ли параметр обязательным или нет, так?
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #36600820
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос по ХПiljyВопрос по ХП,

хотя не, у вас же судя по названию 2000? Тогда там такого еще нет.

Т.е. в 2000 сервере нельзя никак определить является ли параметр обязательным или нет, так?

Ну если только поставить вопрос ребром

Код: plaintext
exec dbo.GetTerminateNodes

и получить ответ на клиенте

Код: plaintext
1.
Msg  201 , Level  16 , State  4 , Procedure GetTerminateNodes, Line  0 
Procedure or function 'GetTerminateNodes' expects parameter '@Node', which was not supplied.
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #36602744
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос по ХПТ.е. в 2000 сервере нельзя никак определить является ли параметр обязательным или нет, так?

можно проанализировать SysComments ) если в определении процедуры между именем параметра и запятой или словом AS есть символ =, и строка не закомментирована, то умолчание существует, вроде так
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Необязательные параметры в ХП
    #38335681
Andrey Rubanko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нужно парсить тело процедруры
вот мой парсер

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
declare
	@procedure varchar(50)

set @procedure = 'Hard'

declare
	@w varchar(max),
	@p int,
	@t varchar(max)



/* 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(SUBSTRING(@w, 1, @p - 1), char(13), ''))
		set @w = SUBSTRING(@w, @p + 1, 10000)
	end else begin
		insert @lines(line) values(replace(@w, char(13), ''))
		set @w = ''
	end
end




/* remove all except parameters */

if (select charindex('@', line) from @lines where id = 1) = 0
	delete @lines
	where id = 1

set @p = 2
while (select charindex('@', line) from @lines where id = @p) > 0 
	set @p = @p + 1

delete @lines
where id >= @p




/* 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
	set @w = replace(@w, char(9), ' ')/* replace Tab with Space */
	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
1.
2.
3.
create procedure Hard @FirstR int,
	@SecondO varchar(10) = null, @ThirdO int = 2, @lastR varchar(50) as
print 'hello'
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #38335719
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Rubankoработает даже если процедура оформлена так
Не работает, если процедура оформлена так:
Код: sql
1.
2.
3.
4.
5.
6.
-- Назначение процедуры: тест парсера
-- Назначение параметров:
--    @id - тестовый параметр
create procedure dbo.test @id int = 1
as
print @id
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #38335727
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или вот
Код: sql
1.
2.
create procedure dbo.Hard as
print '@hello'
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #38335865
Andrey Rubanko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
create procedure ViewParameters
	@procedure varchar(50)
as
	declare
		@w varchar(max),
		@p int, @p2 int,
		@t varchar(max)



	/* 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 
				update @lines
				set line = SUBSTRING(line, 1, @p - 1)
				where id = @i
			
			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 + 1, 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, @p2 + 1, 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
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #38335899
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Rubanko,

Парсинг кода на скуле - мсье знает толк в извращениях.
Есть же встроенная либа, в CLR можете засунуть. ( 9171209 )

А так MS казлы, одно из немногих что нельзя получить. Это притом что колонки есть, а реализацию заленились.
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #38335911
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А такие комменты работают?:
Код: sql
1.
2.
3.
4.
5.
6.
-- /*
SELECT 1
-- */
/*
SELECT 2
-- */ SELECT 3
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #38335947
Andrey Rubanko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ох, так будет

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
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
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #38336404
Andrey Rubanko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
жалко что нельзя редактировать здесь свои посты

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
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
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #38336407
Andrey Rubanko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
правильный вариант

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
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
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #38336433
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Rubanko,

Завидую вашему упорству.
...
Рейтинг: 0 / 0
Необязательные параметры в ХП
    #38336725
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость333Andrey Rubanko,
Завидую вашему упорству.Да в нужное русло.
Andrey Rubanko , посмотрите на такой стиль: 13723059
А то императивный какбэ уже не в моде, мягко говоря; с ним борются. Уже давно слишком много недостатков к "приемуществам".

PS: Хотя в силу появления native compilation в 2014, тормоза сходят на нет и меня это очень сильно расстраивает - начнётся злоупотребление этим говнокодом. Сдерживающим фактором меньше.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Необязательные параметры в ХП
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]