如何使用sql server删除本地表中的记录

时间:2014-03-28 10:21:51

标签: sql sql-server

我可以将记录插入到临时表中。从同一个临时表我需要根据另一个条件删除记录

这是我的代码:

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”。

3 个答案:

答案 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。