PDA

View Full Version : کاربرد IN در استورپروسیجر



mohammadjp
سه شنبه 22 شهریور 1390, 11:30 صبح
عبارت زیر در یک استور پرویسجر بکار رفته است

SELECT name FROM Customer WHERE (Id IN (@CustomerId))

من پارامتر @CustomerId را از نوع Nvarchar تعریف کرده ام و مثلا مقدار '1,2,3' را درون ان میگذارم تا نام مشتریانی را که کد انها 1 یا 2 یا 3 است را برای من پیدا کند
با توجه به اینکه پارامتر رشته و فیلد عددی است پیغام خطا میدهد

Galawij
سه شنبه 22 شهریور 1390, 11:45 صبح
سلام،
یک مثال می ذارم، از طریق فراخوانی یک تابع که اعداد را در پارامتر ورودی از هم جدا می کند، حل می شود.
فراخوانی تابع:
select*from dbo.TbContract where IdContract IN(select*from dbo.Split('5,14,36',','))
تابع مورد نظر:

CreateFUNCTION [dbo].[Split](@String varchar(8000), @Delimiter char(1))
returns @temptable TABLE(items varchar(8000))
as
begin
declare @idx int
declare @slice varchar(8000)
select @idx = 1
iflen(@String)<1 or @String isnullreturn
while @idx!= 0
begin
set @idx =charindex(@Delimiter,@String)
if @idx!=0
set @slice =left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insertinto @temptable(Items)values(@slice)
set @String =right(@String,len(@String)- @idx)
iflen(@String)= 0 break
end
return
end

یوسف زالی
سه شنبه 22 شهریور 1390, 17:20 عصر
برای مواقعی که پارامتر هاتون جدا از همه راه بسیار ساده تری وجود داره:
select * from TBL where Field1 in (select 1 as N union select 2 union select 3) X -- test

راه دیگه در 2008 استفاده از values هست.
select * from TBL where Field1 in (values (1), (2), (3)) X(i) -- test

pashna
چهارشنبه 23 شهریور 1390, 08:58 صبح
سلام ،
راه حل دوستان خیلی خوب بود ولی به نظر من اگر در کد پروژه این کار رو بکنید خیلی بهتره .
مثلا اگر با (#C) کار میکنید همونجا handle کنید بهتره

Galawij
چهارشنبه 23 شهریور 1390, 18:01 عصر
سلام،
یک روش خیلی راحتتر هم هست، تازه متوجه شدم، از طریق SQL پویا. مثال:DECLARE @CategoriesId nvarchar(256)
DECLARE @SqlStatement NVARCHAR(500)
Set @CategoriesId='1,2,15,20'
Set @SqlStatement='SELECT CategoriesName FROM dbo.TbCategories WHERE IdCategories IN ('+@CategoriesId+')'
EXECUTEsp_executesql @SqlStatement

ramin149
جمعه 21 بهمن 1390, 11:42 صبح
من دستور زیر رو که می نویسم جواب درست را به من می ده

SELECT Value, Text
FROM tbl_ProductsList
WHERE (Value IN (63, 70))

اما وقتی به صورت زیر می نویسم هیچ select نمی شه

SELECT Value, Text
FROM tbl_ProductsList
WHERE (Value IN (@Value))

in_chand_nafar
جمعه 21 بهمن 1390, 11:54 صبح
از این حالت استفاده کنید

DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'SELECT Value, Text from FROM tbl_ProductsList Where Value IN (' + @Value + ')'
EXEC (@sqlCommand)

ramin149
جمعه 21 بهمن 1390, 12:07 عصر
از این حالت استفاده کنید

DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'SELECT Value, Text from FROM tbl_ProductsList Where Value IN (' + @Value + ')'
EXEC (@sqlCommand)


دستوری را داخل sp بنویسم ؟

in_chand_nafar
جمعه 21 بهمن 1390, 16:19 عصر
بله كليه اين دستورات داخل SP باشد
@Value
هم به عنوان پارامتر مربوط به SP‌مي باشد

ramin149
سه شنبه 25 بهمن 1390, 23:38 عصر
ALTER PROC [dbo].[Search2]
@Value nvarchar(max),
@Status nvarchar(max),
@Products varchar(1000),
@IdGroupMain nvarchar(10)
AS
BEGIN
DECLARE @sqlCommand varchar(1000)
SET @sqlCommand ='SELECT DISTINCT
tbl_ProductsList.IdProducts, tbl_Products.Products, tbl_Products.Images, tbl_ProductsText.Technical, tbl_ProductsText.FullInfo, tbl_Products.IdGroupMain,
tbl_Status.Name AS Status, tbl_ProductsList.Value
FROM
tbl_ProductsList INNER JOIN
tbl_Products ON tbl_ProductsList.IdProducts = tbl_Products.IdProducts INNER JOIN
tbl_ProductsText ON tbl_Products.IdProducts = tbl_ProductsText.IdProducts INNER JOIN
tbl_PriceProducts ON tbl_Products.IdProducts = tbl_PriceProducts.IdProducts INNER JOIN
tbl_Status ON tbl_PriceProducts.IdStatus = tbl_Status.IdStatus
WHERE
(tbl_ProductsList.Value IN ('+@Value+'))
AND (tbl_Products.IdGroupMain = '+@IdGroupMain+')
AND (tbl_Status.Name IN ('+@Status+'))
ORDER BY tbl_ProductsList.IdProducts DESC'
EXEC (@sqlCommand)
End

در کد بالا وقتی عدد می گزارم درسته اما موقعی که به پارامتر @status مقدار "موجود" را می دم خطا زیر را نمایش می ده
Msg 102, Level 15, State 1, Line 13
Incorrect syntax near '?'.
(1 row(s) affected)
لطفا کمک کنید و 5 روزه روی این موضوع درگیره . فکری به ذهنم نمی رسه !

Galawij
چهارشنبه 26 بهمن 1390, 06:51 صبح
در کد بالا وقتی عدد می گزارم درسته اما موقعی که به پارامتر @status مقدار "موجود" را می دم خطا زیر را نمایش می ده
Msg 102, Level 15, State 1, Line 13
Incorrect syntax near '?'.
(1 row(s) affected)
لطفا کمک کنید و 5 روزه روی این موضوع درگیره . فکری به ذهنم نمی رسه !
سلام،
نمی دونم نوع داده ها را درست و متناسب با نوع داده فیلدها در نظر گرفتید یا نه؟
بهتره برای فیلدهایی که nvarchar(max)در نظر گرفتید، بازه را محدودتر کنید.
قبل از دستور Select، حرف N قرار بدید:
SET @sqlCommand =N'SELECT DISTINCT ....
خط آخر را هم به این صورت تغییر بدید:
EXEC Sp_executesql @sqlCommand
امیدوارم مشکلتون حل بشه.

ramin149
چهارشنبه 26 بهمن 1390, 10:03 صبح
با عرض شرمندگی دوست عزیز مشکلم حل نشد . برای همین دیتابیسم رو ضمینه می کنم تا نگاهی بهش به اندازید و ببینید مشکل کدم کجاست .

نام دیتابیسم shopping .

Galawij
چهارشنبه 26 بهمن 1390, 10:52 صبح
با عرض شرمندگی دوست عزیز مشکلم حل نشد . برای همین دیتابیسم رو ضمینه می کنم تا نگاهی بهش به اندازید و ببینید مشکل کدم کجاست .
سلام،
من کد شما را بررسی کردم، کد با این ساختاری که برای من گذاشتید مشکلی نداره!(با اعمال تغییرات)
مشکل از نحوه فراخوانی شماست. SP را با این مقادیر فراخوانی کنید:
82711
یعنی در نهایت باید همچین ساختاری داشته باشید:

DECLARE @StatusValue NVARCHAR(60)
DECLARE @Query NVARCHAR(500)
SET @StatusValue=''' موجود'',''ناموجود'''
SET @Query=N'SELECT * FROM dbo.tbl_Status WHERE Name IN ('+@StatusValue+')'
EXECUTESp_executesql@Query