2013-04-12 3 views
0

Я делаю запрос, в котором я хочу обновлять столбцы, добавляя к ним новые значения.
Я сделал код SQL, как показано ниже, но я получаю сообщение об ошибке:Ошибка при выполнении обновления через String Concat

DECLARE @sql varchar(max), @Id INT, @Total_Service_Amount float, 
@Total_Cancellation_Charge float, @Total float 

SET @Id = 1 
SET @Total_Service_Amount = 1 
SET @Total_Cancellation_Charge = 2 
SET @Total = @Total_Service_Amount + @Total_Cancellation_Charge 

SET @sql = 'UPDATE [DBO].[Service_Amount] SET Request_Id = ''' 
+ CONCAT (Request_Id, CAST(@Id AS VARCHAR), ',') + ''', 
Amount = ''' + CONCAT (Amount, CAST(@Total) AS VARCHAR), ',') 
+ ''' WHERE Request_For_Id = (SELECT Request_For_Id FROM 
[DBO].Request WHERE [email protected])' 

EXEC sp_executesql @sql 

Я хочу привести, как показано ниже: ДО:

Id | Request_Id | Amount

1 | 1, 2, 3, 4 | 200,300,22,22

ПОСЛЕ:

Id | Request_Id | Amount

1 | 1, 2, 3, 4, 5 | 200,300,22,22,12

Solution:

DECLARE @sql nvarchar(max), @Id INT, @Total_Service_Amount float, @Total_Cancellation_Charge float, @Total float, @beforeId varchar(500), @beforeAmount varchar(max) 
SET @Id = 1 
select @Total_Service_Amount = 1 
select @Total_Cancellation_Charge = 2 
select @Total = @Total_Service_Amount + @Total_Cancellation_Charge 


SELECT @beforeId = Request_Id FROM [DBO].[Service_Amount] WHERE Request_For_Id = (SELECT Request_For_Id FROM [DBO].Request WHERE Id= @Id) 

SELECT @beforeAmount = Amount FROM [DBO].[Service_Amount] WHERE Request_For_Id = (SELECT Request_For_Id FROM [DBO].Request WHERE Id= @Id) 

SET @sql = 'UPDATE [DBO].[Service_Amount] SET Request_Id = ''' + @beforeId + ',' + convert(VARCHAR,@Id) + ', Amount = ''' + @beforeAmount + ',' + convert(VARCHAR,@Total) + ''' WHERE Request_For_Id = (SELECT Request_For_Id FROM [DBO].Request WHERE Id=' + convert(VARCHAR,@Id) + ')' 
EXEC sp_executesql @sql, N'@id int', @Id 
+0

Какая ошибка вы получаете? –

+0

Ошибка @JeffRosenberg в '@sql', вот и все. – Dhwani

+0

Как вы выполняете @SQL? Отправьте весь текст хранимой процедуры/запроса. –

ответ

0

Линия @sql = 'UPDATE... должна быть SET @sql = 'UPDATE...

Кроме того, вам нужно передать свой параметр @id в @sql, как так ..

Вы можете прочитать в документации sp_executesql: http://msdn.microsoft.com/en-us/library/ms188001.aspx

+0

Я пробовал это. Но не помогая мне. Я думаю, что есть ошибка в инструкции Update. Но я не могу понять. – Dhwani

+0

О, право. Вам не хватает команды 'SET'. Я отредактировал свой ответ. –

+0

Пробовал, но теперь отображается ошибка в CONCAT. «CONCAT» не является признанным встроенным именем функции. – Dhwani

0

Если вы хотите склеить нагрузку полей из запроса SELECT в одну строку, иметь игру с такими вещами:

select STUFF(
       (SELECT ',', Request_Id as [text()] 
       FROM [DBO].[Service_Amount] 
       FOR XML PATH ('') 
       ) 
      , 1, 1, '') 

Это может быть установлен в переменную
Set @my_var = (SELECT Stuff...)
и используется в UPDATE SQL

FOR XML часть делает склейку, то STUFF только удаляет ведущую запятую.

+0

Я обновил код сейчас. – Dhwani

+0

Действительно ли вы хотите добавить новое значение к ранее правильному значению (очень простому UPDATE) или вам нужно каждый раз создавать строковое значение с нуля? (что, вероятно, требует подхода «FOR XML», изложенного в моем ответе) –

Смежные вопросы