Динамический SQL

byverka
Дата: 08.09.2006 15:13:54
Пишу процедурку, для того что бы выбирать только те строки, в которых поля Make и Model (и то и другое поле типа nvarchar(50)) содержат (IN) только те значения, что переданы в соответствующих параметрах @Make и @Model. Параметры @Make и @Model в свою очередь представляют из себя длинную строку с данными перечисленными через запятую. (если кто помнит или знает это в Reporting Services - типа мультипараметр, который я распарсиваю вот так: =join(Parameters!Make.Value,","), сам параметр тоже типа строки)
Например параметр @Model может быть таким: 'Golf, Passat, 406, SX400'

В моем примере я беру вообще лишь по одному значению и обхожусь без разделителей и передаю только одно значение в параметр:

DECLARE @HostID int,
	@Make varchar(8000),
	@Model varchar(8000),
	@cases int

	SET @HostID = 3
	SET @Make = 'Volkswagen'
	SET @Model = 'Golf'
	SET @cases = 1

	DECLARE @s nvarchar(1000)

	SET ROWCOUNT  @cases
			
SET @s = 'SELECT TLC.CaseID AS CaseID,
		TLC.DateClosed AS Date_Committed,
		TLV.FinalStlValue AS Settlement_Offer,
		TLC.Mileage,
		TLV.MileageAdj

	FROM 	dbo.TL_Case AS TLC,
		dbo.VehicleDetail VEH,
		dbo.TL_VehicleValuation TLV
			   
	WHERE 	TLC.HostID = @HostID AND
		TLC.CaseID = TLV.CaseID AND
		TLC.VersionNo = TLV.VersionNo AND 
		TLC.VehicleDetailID = VEH.VehicleDetailID AND
		VEH.Make IN ('+ @Make+ ') AND
		VEH.Model IN ('+ @Model +')

ORDER BY TLC.DateFirstCreated DESC'

exec sp_executesql @s, N'@HostID int',
			 @HostID
SET ROWCOUNT 0

В итоге получаю злополучную ошибку, которую не знаю вообще как интрепретировать:

Server: Msg 207, Level 16, State 3, Line 1
Invalid column name 'Volkswagen'.
Server: Msg 207, Level 16, State 1, Line 1
Invalid column name 'Golf'.

Если кто-нибудь в знает в чем тут собака зарылась :) помогите пожалуйста!!
jekaSQL
Дата: 08.09.2006 15:15:35
перед exec стоит сделать print и увидеть, где не хватаеткавычек
у экрана
Дата: 08.09.2006 15:18:03
в in (Volkswagen) а нужно in ('Volkswagen')
byverka
Дата: 08.09.2006 15:18:52
jekaSQL
перед exec стоит сделать print и увидеть, где не хватаеткавычек


Принт чего нужно сделать?
SELECT @s?
byverka
Дата: 08.09.2006 15:20:45
Вот что дал print:

SELECT TLC.CaseID AS CaseID,
		TLC.DateClosed AS Date_Committed,
		TLV.FinalStlValue AS Settlement_Offer,
		TLC.Mileage,
		TLV.MileageAdj

	FROM 	dbo.TL_Case AS TLC,
		dbo.VehicleDetail VEH,
		dbo.TL_VehicleValuation TLV
			   
	WHERE 	TLC.HostID = @HostID AND
		TLC.CaseID = TLV.CaseID AND
		TLC.VersionNo = TLV.VersionNo AND 
		TLC.VehicleDetailID = VEH.VehicleDetailID AND
		VEH.Make IN (Volkswagen) AND
		VEH.Model IN (Golf)

ORDER BY TLC.DateFirstCreated DESC

Собственно все понятно, но как так сделать, что бы Volkswagen и Golf были в кавычках - я ума не приложу....
-=DiM@n=-
Дата: 08.09.2006 15:21:05
Добавь в динамику по две одинарных кавычки и будет тебе счастье :0)
		VEH.Make IN ('''+ @Make+ ''') AND
		VEH.Model IN ('''+ @Model +''')

byverka
Дата: 08.09.2006 15:21:32
Все поняла Спасибо!!!
jekaSQL
Дата: 08.09.2006 15:22:57
byverka
jekaSQL
перед exec стоит сделать print и увидеть, где не хватаеткавычек


Принт чего нужно сделать?
SELECT @s?


ага

в общем ашипка тут
VEH.Make IN ('+ @Make+ ') -- bad

VEH.Make IN ('''+ @Make+ ''') -- good
у экрана
Дата: 08.09.2006 15:24:37
вообщето этот запрос работать не будет так как вы не declare @HostID
-=DiM@n=-
Дата: 08.09.2006 15:26:34
у экрана
вообщето этот запрос работать не будет так как вы не declare @HostID

Это Вы о чем?!