【发布时间】:2015-12-11 07:28:09
【问题描述】:
我正在开发 C# 项目,该项目需要一个将两个表名作为输入的存储过程。
第一个表会将数据复制到一个临时表,该表有两列 URL 和 channelID。然后将此URL 列与其他输入表的 URL 列匹配,如果找到匹配项,则会将通道 ID 从临时表更新为其他表的通道 ID。
我把存储过程写成
CREATE PROCEDURE [dbo].[UpdateTables]
@excelTable NVARCHAR(128) ,
@TableName NVARCHAR(128)
AS
Declare @channel_Id nvarchar(50)
Declare @url varchar(400)
BEGIN
Select *
Into #Temp
From QUOTENAME(@excelTable)
END
While EXISTS(SELECT * From #Temp ) > 0
Begin
Select Top 1
@channel_Id = channel_Id, @url = url
From #Temp
update QUOTENAME(@TableName)
set channelid = @channelid
where pagefullurl like '%'+ @url + '%'
Delete #Temp
Where channelid = @channelid
End
我对@987654325@了解不多,上面的代码有错误。
“>”附近的语法不正确。
消息 137,级别 15,状态 2,过程更新表,第 20 行
必须声明标量变量“@channelid”。消息 137,级别 15,状态 2,过程更新表,第 22 行
必须声明标量变量“@channelid”。
请建议需要进行哪些更改
【问题讨论】:
-
您不能直接参数化表名 - 您必须使用动态 SQL。我也不清楚为什么您将其作为单独的步骤执行,而不仅仅是执行
UPDATE ts SET ... FROM ExcelTable t1 JOIN TableName t2 ON ...。 SQL 是一种基于集合的语言。不要将所有内容分解为过程代码。 -
不使用加入,因为我没有任何列要加入....不知道我们是否可以使用like 子句加入