PDA

View Full Version : سوال: خطا در سینتکس یک جستجو چند پارامتری (داینامیک)



razavi_university
چهارشنبه 20 مرداد 1389, 11:40 صبح
سلام خدمت دوستان
یک SP داینامیک برای جستجو بر اساس چند پارامتر نوشتم. ولی به سینتکس ایراد میگیره. خطا در مقدار دهی SELECT @sql = است، برای کاراکتر Space و / که استفاده کردم .
این Select به صورت جدا به درستی عمل می کند. ولی در اینجا چون در بین ' ' قرار گرفته باعث خطای نگارش می شود.

ممنون میشم راهنماییم کنید که چطور خطا رو رفع کنم


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- ================================================== ========================================
-- Entity Name: s_Courses_SelectCourses
-- Author: M Razavi
-- Create date: 5/29/2010 8:55:30 AM
-- Description: This stored procedure is intended for selecting a specific row from Courses table
-- ================================================== ========================================
ALTER Procedure [dbo].[s_Courses_Search]

@stnid int = NULL,
@ttpid int = NULL,
@lctid int = NULL,
@crsstatus int = NULL,
@debug bit = 0
AS


DECLARE @sql nvarchar(4000),
@paramlist nvarchar(4000)

SELECT @sql =
'SELECT dbo.Courses.crsid, dbo.Skill.sklname AS حرفه, dbo.Mentor.mntfamily +' '+ dbo.Mentor.mntname AS [نام مربی], SUBSTRING(dbo.Courses.crsstartdate,
1, 4) + '/' + SUBSTRING(dbo.Courses.crsstartdate, 5, 2) + '/' + SUBSTRING(dbo.Courses.crsstartdate, 5, 2) AS [تاریخ شروع],
SUBSTRING(dbo.Courses.crsenddate, 1, 4) + '/' + SUBSTRING(dbo.Courses.crsenddate, 5, 2) + '/' + SUBSTRING(dbo.Courses.crsenddate, 5, 2)
AS [تاریخ پایان], SUBSTRING(dbo.Courses.crsexam1date, 1, 4) + '/' + SUBSTRING(dbo.Courses.crsexam1date, 5, 2)
+ '/' + SUBSTRING(dbo.Courses.crsexam1date, 5, 2) AS [تاریخ آزمون کتبی],SUBSTRING(dbo.Courses.crsexam2date, 1, 4) + '/' + SUBSTRING(dbo.Courses.crsexam2date, 5, 2)
+ '/' + SUBSTRING(dbo.Courses.crsexam2date, 5, 2) AS [تاریخ آزمون عملی], dbo.Courses.crsregisteredno AS [تعداد معرفی شده],
dbo.Courses.crsabsentno AS [تعداد غایبین], dbo.Courses.crspassedno AS [تعداد قبولین]
FROM dbo.Courses INNER JOIN
dbo.Location ON dbo.Courses.lctid = dbo.Location.lctid INNER JOIN
dbo.Skill ON dbo.Courses.sklid = dbo.Skill.sklid AND dbo.Courses.sklid = dbo.Skill.sklid INNER JOIN
dbo.Mentor ON dbo.Courses.mntid = dbo.Mentor.mntid INNER JOIN
dbo.Station ON dbo.Courses.stnid = dbo.Station.stnid INNER JOIN
dbo.TutorialType ON dbo.Courses.ttpid = dbo.TutorialType.ttpid
WHERE 1 = 1'

IF @stnid IS NOT NULL
SELECT @sql = @sql + ' AND Courses.stnid = @xstnid'

IF @ttpid IS NOT NULL
SELECT @sql = @sql + ' AND Courses.ttpid = @xttpid'

IF @lctid IS NOT NULL
SELECT @sql = @sql + ' AND Courses.lctid = @xlctid'

IF @crsstatus IS NOT NULL
SELECT @sql = @sql + ' AND Courses.crsstatus = @xcrsstatus'


SELECT @sql = @sql + ' ORDER BY Courses.stnid'

IF @debug = 1
PRINT @sql

SELECT @paramlist = '@xstnid int = NULL,
@xttpid int = NULL,
@xlctid int = NULL,
@xcrsstatus int = NULL'

EXEC sp_executesql @sql, @paramlist,
@stnid, @ttpid, @lctid, @crsstatus



با تشکر

محمد سلیم آبادی
چهارشنبه 20 مرداد 1389, 12:59 عصر
سلام،
مشکل به نقل قول ها بر میگرده. ابتدا درک صحیحی از آن پیدا کنید سپس کار را ادامه دهید:
http://www.30sharp.com/article/13/225/11/%d9%86%d9%82%d9%84-%d9%82%d9%88%d9%84-quotation-%d8%af%d8%b1-sql-server.aspx

محمد سلیم آبادی
چهارشنبه 20 مرداد 1389, 13:40 عصر
مراقب باشید که شما از حروف فارسی هم در رشته استفاده کردین که باید قبل از آن رشته ها کاراکتر N را قرار بدین تا صحیح بشه.
در هر حال اگر با مطالعه مطلبی که بهش لینک دادم نتوانستین این مشکل را برطرف کنید پیشنهاد می کنم از یک تکنیک Static و بسیار ساده زیر این مشکل را حل کنید:

SELECT ...
...
WHERE Courses.stnid = COALESCE(@xstnid, Courses.stnid)
AND Courses.ttpid = COALESCE(@xttpid, Courses.ttpid)
AND Courses.lctid = COALESCE(@xlctid, Courses.lctid)
AND Courses.crsstatus =COALESCE(@xcrsstatus, Courses.crsstatus);