Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Необязательные параметры в ХП / 22 сообщений из 22, страница 1 из 1
27.04.2010, 14:15
    #36600678
Необязательные параметры в ХП
Добрый день!

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

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

а при чем тут syscolumns? Вам sysparameters нужно.
...
Рейтинг: 0 / 0
27.04.2010, 14:26
    #36600717
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные параметры в ХП
iljy, sys.parameters почему-то врет. для всех записей has_default_value = 0 и собсно default_value - NULL
...
Рейтинг: 0 / 0
27.04.2010, 14:27
    #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
27.04.2010, 14:27
    #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
27.04.2010, 14:37
    #36600752
Необязательные параметры в ХП
iljyВопрос по ХП,

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

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

хотя не, у вас же судя по названию 2000? Тогда там такого еще нет.
...
Рейтинг: 0 / 0
27.04.2010, 14:41
    #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
27.04.2010, 14:42
    #36600763
Необязательные параметры в ХП
iljyВопрос по ХП,

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

Т.е. в 2000 сервере нельзя никак определить является ли параметр обязательным или нет, так?
...
Рейтинг: 0 / 0
27.04.2010, 15:15
    #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
28.04.2010, 13:03
    #36602744
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные параметры в ХП
Вопрос по ХПТ.е. в 2000 сервере нельзя никак определить является ли параметр обязательным или нет, так?

можно проанализировать SysComments ) если в определении процедуры между именем параметра и запятой или словом AS есть символ =, и строка не закомментирована, то умолчание существует, вроде так
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
18.07.2013, 14:47
    #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
18.07.2013, 15:07
    #38335719
Гость333
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные параметры в ХП
Andrey Rubankoработает даже если процедура оформлена так
Не работает, если процедура оформлена так:
Код: sql
1.
2.
3.
4.
5.
6.
-- Назначение процедуры: тест парсера
-- Назначение параметров:
--    @id - тестовый параметр
create procedure dbo.test @id int = 1
as
print @id
...
Рейтинг: 0 / 0
18.07.2013, 15:11
    #38335727
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные параметры в ХП
или вот
Код: sql
1.
2.
create procedure dbo.Hard as
print '@hello'
...
Рейтинг: 0 / 0
18.07.2013, 16:21
    #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
18.07.2013, 16:35
    #38335899
Mnior
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные параметры в ХП
Andrey Rubanko,

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

А так MS казлы, одно из немногих что нельзя получить. Это притом что колонки есть, а реализацию заленились.
...
Рейтинг: 0 / 0
18.07.2013, 16:42
    #38335911
Mnior
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные параметры в ХП
А такие комменты работают?:
Код: sql
1.
2.
3.
4.
5.
6.
-- /*
SELECT 1
-- */
/*
SELECT 2
-- */ SELECT 3
...
Рейтинг: 0 / 0
18.07.2013, 17:03
    #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
19.07.2013, 09:17
    #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
19.07.2013, 09:18
    #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
19.07.2013, 09:48
    #38336433
Гость333
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные параметры в ХП
Andrey Rubanko,

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

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


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