Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 параметр в процедуре  [new]
Chek_Fedor
Member

Откуда:
Сообщений: 2011
"столбец" in @p1
где @p1='28,109' при таком присвоении запрос не работает
подскажите как передать строку в p1 чтобы получить выборку. Спасибо
18 янв 12, 12:29    [11924029]     Ответить | Цитировать Сообщить модератору
 Re: параметр в процедуре  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
https://www.sql.ru/forum/afsearch.aspx?s=%EC%E0%F1%F1%E8%E2%FB+%E8+%F1%EF%E8%F1%EA%E8&submit=%CD%E0%E9%F2%E8&bid=1
18 янв 12, 12:34    [11924091]     Ответить | Цитировать Сообщить модератору
 Re: параметр в процедуре  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
https://www.sql.ru/articles/mssql/03060701ArraysAndListsInSQLServer.shtml
18 янв 12, 13:43    [11924957]     Ответить | Цитировать Сообщить модератору
 Re: параметр в процедуре  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Chek_Fedor,

Преобразуйте строку в столбец примерно такой функцией:

CREATE FUNCTION [dbo].[StrListToIntColumn] 
(	
	@CommaList nvarchar(max)
)
RETURNS TABLE 
AS
RETURN 
(
WITH str_nums ( n1, n2) 
AS 
( 
SELECT 0 as n1, CHARINDEX(',', @CommaList + ',') as n2
UNION ALL 
SELECT CAST(n2 AS int) as n1, CHARINDEX(',', @CommaList + ',', n2 + 1) as n2
from str_nums
WHERE n2<LEN(@CommaList)
) 
SELECT CONVERT(int, SUBSTRING(@CommaList, n1+1, n2-n1-1)) as Value FROM str_nums
WHERE LTRIM(RTRIM(SUBSTRING(@CommaList, n1+1, n2-n1-1))) <> ''
)

DECLARE @IntTable table (Id int);

INSERT INTO @IntTable(Id)
SELECT Value FROM dbo.StrListToIntColumnSQL('1,2,3')

"столбец" in (SELECT Id FROM @IntTable)
18 янв 12, 14:47    [11925627]     Ответить | Цитировать Сообщить модератору
 Re: параметр в процедуре  [new]
Chek_Fedor
Member

Откуда:
Сообщений: 2011
Использую функцию для распарсинга строки
USE [Store]
GO
/****** Object:  UserDefinedFunction [dbo].[ParseString]    Script Date: 01/19/2012 11:21:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[ParseString](@S VARCHAR(MAX), @Delimiters VARCHAR(MAX))
RETURNS TABLE AS RETURN
SELECT N,S
FROM
(
 SELECT V.number,SUBSTRING(@S COLLATE Cyrillic_General_CI_AI,V.number,
  (
   SELECT MIN(VV.number)
   FROM master.dbo.spt_values VV
   WHERE VV.type='P' AND VV.number BETWEEN V.number AND LEN(@S)+1
   AND CHARINDEX(SUBSTRING(@S+LEFT(@Delimiters,1),VV.number,1),@Delimiters)>0
  )-V.number
 )
 FROM master.dbo.spt_values V
 WHERE V.type='P' AND V.number BETWEEN 1 AND LEN(@S)+1
 AND CHARINDEX(SUBSTRING(LEFT(@Delimiters,1)+@S,V.number,1),@Delimiters)>0
)T(N,S)
WHERE S>'';

которая при выполнении процедуры

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[z_main_block_proc] 
	-- Add the parameters for the stored procedure here
	@p1 int = 0,
	@p2 char =0
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	SELECT	[rb_subjects_blocks_name].[indx] as indx_blok,
			[rb_subjects_blocks_name].[name], [z_subjects_blocks].[remark],
			[z_subjects_blocks].[indx], [z_subjects_blocks].[type], [z_subjects_blocks].[id_name],
			[z_subjects_blocks].[short_name], [z_subjects_blocks].checkbox
	FROM [Store].[dbo].[z_subjects_blocks]
	INNER JOIN [Store].[dbo].[rb_subjects_blocks_name]  on ([Store].[dbo].[rb_subjects_blocks_name].[indx]=[Store].[dbo].[z_subjects_blocks].[id_name]) and
	([Store].[dbo].[z_subjects_blocks].[type]=@p1) and ([Store].[dbo].[z_subjects_blocks].[indx] in (SELECT S FROM [Store].[dbo].ParseString('28,109',' ,')));
END

возвращает нужные значения но если заменить [Store].[dbo].ParseString('28,109',' ,') на [Store].[dbo].ParseString(@p2,' ,') то не работает.
Как заставить работать функцию которой в процедуре передают параметр? Спасибо.
19 янв 12, 11:30    [11930881]     Ответить | Цитировать Сообщить модератору
 Re: параметр в процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104751
Вы бы проверяли сначала, что вы передаете в функцию

@p2 char = @p2 char(1)
19 янв 12, 11:34    [11930905]     Ответить | Цитировать Сообщить модератору
 Re: параметр в процедуре  [new]
Chek_Fedor
Member

Откуда:
Сообщений: 2011
А как правильно то сделать?
19 янв 12, 11:47    [11931017]     Ответить | Цитировать Сообщить модератору
 Re: параметр в процедуре  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Chek_Fedor
А как правильно то сделать?

Пойти выпить кофе и подумать головой. Скопипастить же функцию iap как-то смогли. Значит и разницу между char,char(n),varchar,varchar(n),varchar(max) тоже должны осилить.
19 янв 12, 11:53    [11931067]     Ответить | Цитировать Сообщить модератору
 Re: параметр в процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104751
Chek_Fedor
А как правильно то сделать?

Наверное задать какую длину для этого параметра больше 1го символа ?
19 янв 12, 11:53    [11931072]     Ответить | Цитировать Сообщить модератору
 Re: параметр в процедуре  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
еще вариант рассмотрите, тут парсить ничего не нужно
если конечно у вас sql server 2008
CREATE TYPE dbo.tvpIntList AS TABLE (
	id INT
)
GO

ALTER PROCEDURE [dbo].[z_main_block_proc] 
	@p1 int = 0,
	@p2 dbo.tvpIntList READONLY
AS
BEGIN
	SET NOCOUNT ON;

    SELECT	[rb_subjects_blocks_name].[indx] as indx_blok,
			[rb_subjects_blocks_name].[name], [z_subjects_blocks].[remark],
			[z_subjects_blocks].[indx], [z_subjects_blocks].[type], [z_subjects_blocks].[id_name],
			[z_subjects_blocks].[short_name], [z_subjects_blocks].checkbox
	FROM [Store].[dbo].[z_subjects_blocks]
	INNER JOIN [Store].[dbo].[rb_subjects_blocks_name]  on ([Store].[dbo].[rb_subjects_blocks_name].[indx]=[Store].[dbo].[z_subjects_blocks].[id_name]) and
	([Store].[dbo].[z_subjects_blocks].[type]=@p1) and ([Store].[dbo].[z_subjects_blocks].[indx] in (SELECT id FROM @p2 ));
END
GO

-- sql call 
DECLARE @p2 dbo.tvpIntList
INSERT INTO @p2 (id)
VALUES (28), (109) --, (...), ...

EXEC [dbo].[z_main_block_proc] @p1 = 1, @p2 = @p2
19 янв 12, 11:54    [11931084]     Ответить | Цитировать Сообщить модератору
 Re: параметр в процедуре  [new]
Chek_Fedor
Member

Откуда:
Сообщений: 2011
Да, спасибо, разобрался varchar(max).
19 янв 12, 11:56    [11931099]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить