2013-11-20 2 views
0

Я использую SQL-скрипт для создания тела письма со значениями из базы данных для перехода к хранимой процедуре, однако я получаю «неправильный синтаксис рядом с ошибкой« + »в следующей строке:Ошибка синтаксиса SQL Concatenation

@body = 'Item number ' + @ref + 'is due calibration on ' + convert(nvarchar(20), @next) + '. <br><br>Please take the necessary action to ensure the item is calibrated before this time. <br><br>You can view the item here > http://server/app/ViewItem.aspx?calibration_no=' + @ref 

исх является NVARCHAR (50) следующего является дата тело является NVARCHAR (макс)

Может кто-нибудь объяснить, где я буду неправильно? Благодаря!

EDIT - Полный запрос и процедура

Извините за Pastebin ссылок, не мог получить отступы прямо в редакторе на здесь.

Запрос является HERE

Процедура HERE

+0

Извините, это nvarchar (max). Я отредактирую вопрос – Jimsan

+0

Опубликовать весь запрос. Это, похоже, не проблема. –

+0

Попробуйте распечатать ref и затем для строки, которая дает ошибку, или, как было предложено выше, разместите больше запросов. –

ответ

2

Я хотел бы предложить вам объявить переменную, помещаем содержимое в переменную, а затем установить @body параметров с этой переменной :

declare @MailBody nvarchar(max) 
declare 
@out_desc nvarchar(max), 
@out_mesg nvarchar(50) 
declare @ref nvarchar(50), 
@next date 
declare c1 cursor read_only 
for 
select [calibration_no], [description], [next_calibration] 
from calibration.dbo.item 
open c1 
fetch next from c1 into 
@ref, @next 
while @@fetch_status = 0 
begin 
if datepart(month,@next) <= dateadd(month, 1, (datepart(month, getdate()))) 
begin 
SET @MailBody = 'Item number ' + STR(@ref) + 'is due calibration on ' + STR(convert(nvarchar(20), @next)) 
+ '. <br><br>Please take the necessary action to ensure the item is calibrated before this time. 
<br><br>You can view the item here > http://server/app/ViewItem.aspx?calibration_no=' + STR(@ref) 
exec calibration.dbo.spSendMail @recipients = 'xxxxxxxx', 
@subject = 'Test Email', 
@from = 'xxxxxxxx', 
@body = @MailBody 
@output_mesg = @out_mesg output, 
@output_desc = @out_desc output 
print @out_mesg 
print @out_desc 
end 
fetch next from c1 into 
@ref, @next 
end 
close c1 
deallocate c1 
+0

Спасибо jyparask. Теперь он работает. Было еще несколько ошибок с исходным кодом сценария, который я предоставил, поэтому я изменил эти биты, и теперь полный рабочий сценарий можно найти здесь> [link] (http://pastebin.com/aJQsgUbB) – Jimsan

0

Чтобы быть на безопасной стороне, я всегда обернуть переменную с STR()

Это удается избежать некорректной Синтаксическая ошибка

Таким образом, ваш код будет читать ...

@body = 'Item number ' + STR(@ref) + 'is due calibration on ' + STR(convert(nvarchar(20), @next)) + '. <br><br>Please take the necessary action to ensure the item is calibrated before this time. <br><br>You can view the item here > http://server/app/ViewItem.aspx?calibration_no=' + STR(@ref) 
+0

Я не совсем уверен, как это сделать, если честно, Майк. Я собираюсь расширить вопрос, поскольку я думаю, что это может быть более глубокая проблема, чем конкатенация. – Jimsan

+0

@Jimsan. Я обновил свой ответ, чтобы поместить соответствующий STR() в ваш код. – Mike

+0

Спасибо, Майк, все еще получая ту же ошибку. Попытка опубликовать весь скрипт и процедуру, но с копированием и вставкой кода. Сохраняет сообщение об отправке сообщений об ошибках, поскольку оно не отформатировано правильно в поле вопроса. Bare with me – Jimsan

0

Для чего это стоит, следующий обработанное отлично для меня в SQL Server:

declare @body nvarchar(max) 
declare @ref nvarchar(50) 
declare @next date 

select @ref = 'test' 
select @next = getdate() 

select @body = 'Item number ' + @ref + 'is due calibration on ' + convert(nvarchar(20), @next) + '. <br><br>Please take the necessary action to ensure the item is calibrated before this time. <br><br>You can view the item here > http://server/app/ViewItem.aspx?calibration_no=' + @ref 
select @body 
+0

Я все еще получаю ошибку. Я разберу этот вопрос, поскольку я думаю, что это может быть более глубокая проблема, чем просто синтаксис конкатенации. – Jimsan

+0

Можете ли вы подтвердить свою платформу базы данных ... SQL Server? – Seymour

+0

К сожалению, это SQL Server 2008 R2 – Jimsan