0

我正在做一个查询,我想通过将新值连接到这些列来更新列。
我编写了如下 SQL 代码,但出现错误:

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 Id=@Id)' 

EXEC sp_executesql @sql

我想要如下结果:之前:

身份证 | 请求 ID | 数量

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

后:

身份证 | 请求 ID | 数量

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

解决方案:

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
4

2 回答 2

0

该行@sql = 'UPDATE...应该是SET @sql = 'UPDATE...

此外,您需要将@id参数传递给@sql,就像这样..

EXEC sp_executesql @sql, N'@id int', @id

您可以在以下文档中阅读更多信息:http sp_executesql: //msdn.microsoft.com/en-us/library/ms188001.aspx

于 2013-04-12T13:00:14.700 回答
0

如果您想将 SELECT 查询中的大量字段粘合到一个字符串中,请尝试以下操作:

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

这可以设置为变量
Set @my_var = (SELECT Stuff... )
并在UPDATEsql中使用

FOR XML部分将粘合在一起,STUFF只是删除了前导逗号。

于 2013-04-12T13:10:54.470 回答