PDA

View Full Version : عدم بازگردانی اطلاعات در sp



hrj1981
چهارشنبه 23 دی 1394, 15:28 عصر
با سلام
دوستان این sp رو مشاهده کنید

ALTER PROCEDURE [dbo].[SP_RPT_Confilted_Azmoon_documents_Server] @Year_ID VARCHAR(4)='1394',
@School_UID VARCHAR(1500)='''90002'',''90004''',
@Path_Shenasnameh NVARCHAR(500)='SamplePath'
AS
BEGIN
SELECT
tBL_nAME.FILED
[CD_Shenasnameh]=(SELECT dbo.F_FileExists(@Path_Shenasnameh + tBL_nAME.Student_NationalCode +'.jpg'))
FROM
tBL_nAME
WHERE
(tBL_nAME.Year=@Year_id)
AND (tBL_nAME.Resive_School_UID IN (@School_UID))
AND (tBL_nAME.En_Date BETWEEN @En_Date_s AND @En_Date_E)
END
من مشکلم فقط با اون قسمتی هست که قرمز رنگ کردم هستش ، نمیدونم چه جور اون مقادیر تو IN بذارم که جواب رو برگردونه

saeedr22
چهارشنبه 23 دی 1394, 22:14 عصر
از تابع زیر استفاده یکنید
-- =============================================
-- Author: ei>
-- Create date: <2014/01/26>
-- Description: <تابع زير يک رشته ورودي مي گيرد که قرار است آنرا بر اساس کاراکتر جدا کننده اي
-- که به آن فرستاده شده است از هم جدا کند و جدولي را متشکل از قطعه هاي رشته برمي گرداند >
-- =============================================
CreateFUNCTION [dbo].[fn_Spliter]
(
@str_Source NVARCHAR(MAX),
@Separator NVARCHAR(50)
)
RETURNS @tbl_Result TABLE (Word NVARCHAR(250))
AS
BEGIN
DECLARE @tbl_Temp TABLE(Word NVARCHAR(250))

DECLARE @str_Temp NVARCHAR(50)


SET @str_Temp = @str_Source

WHILE (LEN(@str_Temp) > 0)
BEGIN
IF CHARINDEX(@Separator, @str_Temp) <> 0
BEGIN
IF SUBSTRING(@str_Temp, 1, CHARINDEX(@Separator, @str_Temp) -1) <>
''
INSERT INTO @tbl_Temp
(
Word
)
VALUES
(
SUBSTRING(@str_Temp, 1, CHARINDEX(@Separator, @str_Temp) -1)
)

SET @str_Temp = SUBSTRING(
@str_Temp,
CHARINDEX(@Separator, @str_Temp) + 1,
LEN(@str_Temp) - CHARINDEX(@Separator, @str_Temp)
)
END
ELSE
BREAK
END

IF (LEN(@str_Temp) > 0)
INSERT INTO @tbl_Temp
(
Word
)
VALUES
(
@str_Temp
)

INSERT @tbl_Result
SELECT WORD
FROM @tbl_Temp

RETURN
END


استفاده از تابع بالا

SELECT *
FROM fn_spliter('1,2,3', ',')


فقط سعی کنید به جای IN از Join استفاده کنید.

ham3d1988
پنج شنبه 24 دی 1394, 12:30 عصر
سلام معمولا برای چنین پراسیجرهایی که جستجو با حالات مختلف انجام میشه بهتره از دینامیک کوئری استفاده کنید
مثلا واسه نمونه مثال خودتون میتونید این شکلی بنویسید:


ALTER PROCEDURE [dbo].[SP_RPT_Confilted_Azmoon_documents_Server]
@Year_ID VARCHAR(4)='1394',
@School_UID VARCHAR(1500)='90002 , 90004',
@Path_Shenasnameh NVARCHAR(500)='SamplePath',
@En_Date_s DATETIME,
@En_Date_E DATETIME
AS
BEGIN

DECLARE @statment NVARCHAR(MAX)=''
DECLARE @WhereClause NVARCHAR(MAX)=''

IF @Year_ID IS NOT NULL AND @Year_ID<>'-1' -- يک مقدار پيش فرض براي خالي بود مقادير مانند منفي يک انتخاب کنيد
SET @WhereClause+=' and tBL_nAME.Year=''' + @Year_ID + ''''

IF @School_UID IS NOT NULL AND @School_UID<>'-1'
SET @WhereClause+=' and tBL_nAME.Resive_School_UID IN (''' + @Year_ID + ''')'

IF @En_Date_s IS NOT NULL
SET @WhereClause+=' and tBL_nAME.En_Date >= ''' + cast(@En_Date_s AS NVARCHAR(20)) + ''''
IF @En_Date_E IS NOT NULL
SET @WhereClause+=' and tBL_nAME.En_Date <= ''' + cast(@En_Date_E AS NVARCHAR(20)) + ''''

SET @statment='
SELECT tBL_nAME.FILED
[CD_Shenasnameh]=(SELECT dbo.F_FileExists(@Path_Shenasnameh + tBL_nAME.Student_NationalCode +''.jpg''))
FROM tBL_nAME
WHERE 1=1 '

SET @statment+=@WhereClause
print @statment
EXEC sp_executesql @statment


END