Чтобы избавить себя от лишних хлопот, вы можете использовать параметры и с динамическим SQL, да! - параметры, как в вашем реальном запросе.
Set @nvQuery = ' Select substring(PSD.DTSItemCode,1,4) As ItemCompanyCode , '
Set @nvQuery = @nvQuery + ' convert(varchar(50),Cast(Sum(PSD.Quantity) as money),1) As TotalShipped '
Set @nvQuery = @nvQuery + ' From [AVANTISERVER\NCL_MASTER].AVANTI.dbo.PackingSlipHeader PSH '
Set @nvQuery = @nvQuery + ' Inner Join [AVANTISERVER\NCL_MASTER].AVANTI.dbo.PackingSlipsDetail PSD On PSH.PKSNumber = PSD.PKSNumber '
Set @nvQuery = @nvQuery + ' Where Cast ( PKSDate As DateTime ) >= @start '
Set @nvQuery = @nvQuery + ' And Cast ( PKSDate As DateTime ) <= @end '
Set @nvQuery = @nvQuery + ' And PSD.Quantity > 0 '
Set @nvQuery = @nvQuery + ' And ( CompanyCode = @CustomerCode) '
Set @nvQuery = @nvQuery + ' Group By substring(PSD.DTSItemCode,1,4) '
Set @nvQuery = @nvQuery + ' Order By substring(PSD.DTSItemCode,1,4) '
Вместо запуска через
EXEC (@nvQuery)
используйте форму
exec sp_executeSQL @nvQuery,
N'@start datetime,@end datetime,@customerCode varchar(6)', --list of params
@start, @end, @customerCode -- params, matching list
Это позволяет обойти все виды манипулирования строками, проблемы приведения / форматирования. например,
declare @start datetime,@end datetime,@customerCode varchar(6)
select @start = getdate(), @end = getdate()+2, @customerCode = 'TEST'
set @nvQuery ... -- build the statement
exec sp_executeSQL @nvQuery,
N'@start datetime,@end datetime,@customerCode varchar(6)', --list of params
@start, @end, @customerCode -- params, matching list