我可以将记录插入到临时表中。从同一个临时表我需要根据另一个条件删除记录
这是我的代码:
DECLARE @tempDataTable Table
(
Id bigint,
Title varchar(max),
Forename varchar(max),
Surname varchar(max),
Addr1 varchar(max),
Addr2 varchar(max),
Addr3 varchar(max),
Village varchar(max),
Town varchar(max),
Postcode varchar(max),
LatestER varchar(50),
RowNum bigint
)
DECLARE @sqlQuery varchar(max)
SET @sqlQuery = 'SELECT [Id]
,[Title]
,[ForName]
,[Surname]
,[Addr1]
,[Addr2]
,[Addr3]
,[Village]
,[Town]
,[Postcode]
,[LatestER]
,ROW_NUMBER() OVER(PARTITION BY (DomicileId) ORDER BY Title) as RowNum
FROM [dbo].[DPS_DataRegion_Scotland]
WHERE (' + @searchFilteredDataCondition + ')'
INSERT INTO @tempDataTable
EXEC (@sqlQuery)
以上部分工作正常。在这里,我需要从 @tempDataTable
中删除记录SET @sqlQuery = 'DELETE FROM '+ @tempDataTable +'
WHERE (' + @searchFilteredTownCondition + ')'
EXEC (@sqlQuery)
插入它时会抛出错误 - 必须声明标量变量“@tempDataTable”。
答案 0 :(得分:0)
您的问题是您需要在动态SQL中使用变量的名称,例如
SET @sqlQuery = 'DELETE FROM @tempDataTable'
但是你不能以这种方式在动态SQL中使用你的表变量 - 它不会在动态SQL执行的范围内可见。您必须在一个动态SQL批处理中声明所有内容并使用一个EXEC
或使用临时表。
后者看起来像:
CREATE TABLE #tempDataTable
(
Id bigint,
Title varchar(max),
Forename varchar(max),
Surname varchar(max),
Addr1 varchar(max),
Addr2 varchar(max),
Addr3 varchar(max),
Village varchar(max),
Town varchar(max),
Postcode varchar(max),
LatestER varchar(50),
RowNum bigint
)
DECLARE @sqlQuery varchar(max)
SET @sqlQuery = 'SELECT [Id]
,[Title]
,[ForName]
,[Surname]
,[Addr1]
,[Addr2]
,[Addr3]
,[Village]
,[Town]
,[Postcode]
,[LatestER]
,ROW_NUMBER() OVER(PARTITION BY (DomicileId) ORDER BY Title) as RowNum
FROM [dbo].[DPS_DataRegion_Scotland]
WHERE (' + @searchFilteredDataCondition + ')'
INSERT INTO #tempDataTable
EXEC (@sqlQuery)
SET @sqlQuery = 'DELETE FROM #tempDataTable WHERE (' + @searchFilteredTownCondition + ')'
EXEC (@sqlQuery)
答案 1 :(得分:0)
插入它时会抛出错误 - 必须声明标量变量" @ tempDataTable"。
您是否曾查看过要发送给服务器的SQL?不是来源。基本上打印出SQL。
SET @sqlQuery =' DELETE FROM' + @tempDataTable +'
翻译成
DELETE FROM (content of @tempDataTable)
如果要使用@tempdataTable作为表的名称,请将其作为字符串的一部分,而不是参数。
SET @sqlQuery = 'DELETE FROM @tempDataTable'
答案 2 :(得分:0)
我会尽量避免使用动态SQL,除非它绝对必要。您的问题是您正在使用@tempDataTable,就好像它是一个字符串变量来构建动态SQL语句。
它是一个表变量,因此您可以像实际表一样使用它,即:
DELETE FROM @tempDataTable
您能举例说明存储在@searchFilteredTownCondition中的值吗?如果你可以用列名和单个变量中传递的比较值替换它会更容易 - 那么你就可以省去动态SQL。