PDA

View Full Version : دستور select با شروط and متغیر



aria2006
شنبه 23 آبان 1394, 11:27 صبح
سلام
قبل از اینکه این تاپیکو بزنم جستجو کردم ولی راستش اونجوری که میخواستم مشکلم حل نشد.
من یه گزارش دارم که دستور select اون یه تعداد رکورد رو از دیتا بیس برمیگردونه منتها شرطش میخوام بصورتی باشه که کاربر بر اساس انتخاب و ارسال پارامترهایی که از ورودی میده اونا رو با هم and کنه و نتیجه رو برگردونه ولی راستش نمیدونم چطوری؟ مثلا وقتی کاربر در ورودی گزارش فقط شماره تلفن رو داد بگرده هر تعداد رکورد فیلد تلفنشون برابر با همونی هست که کاربر انتخاب کرده نمایش بده حالا اگه کاربر علاوه بر تلفن کد ملی رو هم انتخاب کرده بیاد این دو تا با هم and کنه و رکوردهایی که کد ملی و تلفنشون همونی هست که کاربر تعیین کرده برگردونه و الی آخر .... اما نمیدونم چجوری... مثلا من در sp زیر اومدم فیلد مورد نظرم کد عنوان رو پیش فرض null گذاشتم ولی اینجوری مشکلم حل نمیشه...


create procedure sp_AsnadSearch
(@persenel_no int,
@code_onvan nvarchar(5)=null)
as
begin
select persenel_no,radif,name_onvan,sanad_date,scan_date, karbar,vajekey,sharh from A_archive where persenel_no=@persenel_no and code_onvan=@code_onvan
end
go

En_MK
شنبه 23 آبان 1394, 13:34 عصر
سلام
شما باید یه sp dynamic بنویسید.یعنی سمت کد اگر شرطاتون رو بسازید و به عنوان ورودی به sp پاس بدید
یه چیزی شبیه این (http://dba.stackexchange.com/questions/790/building-dynamic-sql-server-where-clause)

aria2006
شنبه 30 آبان 1394, 08:27 صبح
سلام
شما باید یه sp dynamic بنویسید.یعنی سمت کد اگر شرطاتون رو بسازید و به عنوان ورودی به sp پاس بدید
یه چیزی شبیه این (http://dba.stackexchange.com/questions/790/building-dynamic-sql-server-where-clause)

سلام من بارها کد پراسجرم رو بالا پایین کردم ولی به جواب نرسیدم. بدون خطا اونو میسازه ولی موقع اجرا خطا syntax میده....


create procedure sp_AsnadSearch
(@persenel_no int=null,
@code_onvan nvarchar(5)=null)
as
begin
declare @sql nvarchar(4000)

SELECT @sql = 'persenel_no,code_onvan,radif,name_onvan,sanad_dat e,scan_date,karbar,vajekey,sharh
from A_archive
WHERE 1=1 '

IF @persenel_no IS NOT NULL
SELECT @sql = @sql + ' AND persenel_no=@persenel_no'

IF @code_onvan IS NOT NULL
SELECT @sql = @sql + ' AND code_onvan=@code_onvan'
EXEC sp_executesql @sql ,N'@persenel_no int, @code_onvan nvarchar(5)' , @persenel_no, @code_onvan

end
go





کد خطا هنگام execute کردن پراسجر :
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ','.

(1 row(s) affected)

و جواب هم صفر برمیگردونه.....

اساتید کسی هست ایراد کار منو بگه که چطور میشه در اس کسو ال چن تا شرط رو با هم اند کرد که متغیر هم باشن ؟؟

En_MK
شنبه 30 آبان 1394, 14:39 عصر
من sp شما رو تغییر دادم و فقط نام جداولی که در دیتابیسم داشتم را گذاشتم ونتیجه داد
در این جور مواقع بهترین کار اینه که شما بدنه sp را بردارید و اجرا کنید و یا از @sql قبل از اجرا پیرینت بگیرید


declare @id int=null
declare @sql nvarchar(4000)
declare @username nvarchar(5)=null
SELECT @sql = 'select username from TbUser WHERE 1=1 '
set @id=1

IF @id IS NOT NULL
SELECT @sql = @sql + ' AND id=@id'

IF @username IS NOT NULL
SELECT @sql = @sql + ' AND username=@username'
print @sql
EXEC sp_executesql @sql ,N'@id int, @username nvarchar(5)' , @id, @username

aria2006
یک شنبه 01 آذر 1394, 09:08 صبح
من sp شما رو تغییر دادم و فقط نام جداولی که در دیتابیسم داشتم را گذاشتم ونتیجه داد
در این جور مواقع بهترین کار اینه که شما بدنه sp را بردارید و اجرا کنید و یا از @sql قبل از اجرا پیرینت بگیرید


declare @id int=null
declare @sql nvarchar(4000)
declare @username nvarchar(5)=null
SELECT @sql = 'select username from TbUser WHERE 1=1 '
set @id=1

IF @id IS NOT NULL
SELECT @sql = @sql + ' AND id=@id'

IF @username IS NOT NULL
SELECT @sql = @sql + ' AND username=@username'
print @sql
EXEC sp_executesql @sql ,N'@id int, @username nvarchar(5)' , @id, @username




خیلی ممنونم از شما - جواب گرفتم. در ابتدای رشته sql@ یک select باید اضافه میکردم که نمیدونستم.:بوس: