View Full Version : ترکیب دو رشته در sp
na3er-faraji
چهارشنبه 26 آبان 1389, 15:18 عصر
سلام . فرض کنید یه رشته داریم در یک sp به شکل زیر
ALTER PROCEDURE dbo.Product_Select_ByProductId
(
@parametr1 nvarchar(250)
)
AS
Select * From tblProduct Where ProductId in ( paramet1 )
RETURN
حالا من میخام به جای parametr1 ورودی مثلا بفرستم 3,5,6 تا select انجام شه. اما نمیدونم داخل sp چه جوری پارامتر ورودی رو با رشته sp ترکیب کنم؟ لطفا راهنمایی کنید؟؟؟
بهزادصادقی
چهارشنبه 26 آبان 1389, 22:33 عصر
سلام.
برای اینکار نیاز به تغییر خاصی نیست.
این procedure رو به شکل زیر تغییر بدید بعد نوع فراخوانیش رو براتون می نویسم.
ALTER PROCEDURE dbo.Product_Select_ByProductId ( @parametr1 nvarchar(250) ) AS Select * From tblProduct Where ProductId in (@paramet1)
Go
اینم شکل فراخوانی
Product_Select_ByProductId('1,2,3,4')
حمید رضا جان،
فکر کنم این روش کار نخواهد کرد مگر اینکه کل دستور select به صورت یک دستور dynamic sql ساخته و اجرا شود.
حمیدرضاصادقیان
پنج شنبه 27 آبان 1389, 00:25 صبح
حمید رضا جان،
فکر کنم این روش کار نخواهد کرد مگر اینکه کل دستور select به صورت یک دستور dynamic sql ساخته و اجرا شود.
سلام.
حق با شماست. من هنگام پست این مطلب تمرکزم جای دیگری بود .
باید از طریق Dynamic Sql نوشته شود.
که میتوانید به این شکل عمل کنید.
create procedure myproc(@clause varchar(100)) as
begin
exec sp_executesql 'select * from users where userid in ( ' + @clause +' )'
end
همچنین میشه یک تابع براش نوشت و با استفاده از اون اینکارو کرد که مثالش در این لینک (http://stackoverflow.com/questions/1525126/sql-in-clause-in-storedprocedurehow-to-pass-values)موجود هست.
na3er-faraji
پنج شنبه 27 آبان 1389, 12:02 عصر
ALTER PROCEDURE dbo.Product_Select_ByProductId(@ProductId nvarchar(250))
AS
Begin
exec sp_executesql 'Select * From tblProduct Where ProductId in (' + @ProductId + ')'
End
جناب صادقیان اینجوری هم نوشتم جواب نداد. این sp_executesql چیه؟؟؟
m_omrani
جمعه 28 آبان 1389, 00:56 صبح
این روش (Dynamic SQL) به شکلی که نشان داده شده است توصیه نمی شود. زیرا برنامه شما را به شدت مستعد حمله SQL Injection می کند.
فرض کنید کاربر چنین مقداری را برای sp شما بفرستد:
0);update [users] set password=null where username=''admin'';select 1 where 1 in (1در این حالت علاوه بر انتخاب شدن کالاها، پسورد administrator هم ریست می شود!
به جای این که ایست اعداد را به صورت رشته بفرستید، بهتر است از روش ها و ساختارهای دیگری استفاده کنید یا خودتان در یک حلقه، اعداد را از درون رشته بیرون بکشید.
در این خصوص بحث ها و پست های متعددی در تالار هست. با کمی جستجو پیدا می کنید.
حمیدرضاصادقیان
جمعه 28 آبان 1389, 09:01 صبح
سلام.البته میتونند با استفاده از یک تابع قبل از ارسال به داخل کوئری صحت رشته مورد نظر رو بررسی کنند .
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.