从用户指定的表中删除内容

时间:2014-02-08 05:37:35

标签: sql sql-server-2008 stored-procedures

我正在尝试删除某些表的内容。我希望用户选择表名,并将它们连接成一个字符串。例如:Brands,Products,ProductGroups此字符串将传递给存储过程DBReset。我有一个函数来拆分字符串并将值作为表返回。它工作正常。现在我想删除从名为Split的函数返回的3个表(不包括branchID = 0的内容)的内容。 这是我尝试过的:

CREATE PROCEDURE DBReset

        (@Tables varchar(200))
AS
BEGIN
DELETE FROM (SELECT Items FROM [dbo].[Split] (@Tables, ',')) WHERE BranchID<>0
END

哪个出错:

Incorrect syntax near '('.
Incorrect syntax near the keyword 'WHERE'.

然后我尝试了动态sql:

EXEC('DELETE FROM (SELECT Items FROM [dbo].[Split] ('+@Tables+', '','')) WHERE BranchID<>0')

执行时会出现相同的错误。 有没有办法做到这一点?感谢您分享宝贵的时间。

3 个答案:

答案 0 :(得分:0)

你很可能需要遍历split中的结果集,然后使用exec来执行带有当前循环迭代范围内的表的sql,并在你的where子句中添加。 / p>

你可以通过游标或while循环来实现这一目的。

答案 1 :(得分:0)

问题解决了。代码如下:

CREATE PROCEDURE DBReset

        (@Tables varchar(200))
AS
BEGIN

DECLARE @TableName as varchar(30)
DECLARE CSR CURSOR
FOR
(SELECT Items FROM [dbo].[Split] (@Tables, ','))
OPEN CSR
FETCH NEXT FROM CSR INTO @TableName
WHILE @@FETCH_STATUS=0
    BEGIN
        EXEC('DELETE FROM '+@TableName+' WHERE BranchID<>0')
        FETCH NEXT FROM CSR INTO @TableName
    END
CLOSE CSR
DEALLOCATE CSR
END

像魅力一样工作。感谢Adam Grande展示踏脚石。 注意:接受AJJ的答案,因为方法1似乎更简单。

答案 2 :(得分:0)

方法1:

您不能从单个查询中删除多个表(除非您的表之间有外键约束并激活约束上的“级联删除”选项)

在您的情况下,最简单的方法是替换逗号,如下所示并使用动态SQL:

DECLARE @CONDITION VARCHAR(255)
SET @CONDITION = ' WHERE BRANCHID <> 0; DELETE FROM '

SET @TABLELIST = 'DELETE FROM ' + REPLACE(@Tables,',',@CONDITION)+' WHERE BRANCHID <> 0;'
EXEC (@TABLELIST)

方法2:

如果要使用split函数方法,则需要在split函数&amp;中返回Table Names。可以使用动态SQL:

  1. 创建函数以返回表名:

    CREATE FUNCTION dbo.SPLIT_FUNTION(
    @SINPUTLIST VARCHAR(MAX) -- Your data to be split
    , @SDELIMITER VARCHAR(5000) = ',' -- The Delimited that is used for splitting
    ) RETURNS @TABLELIST TABLE (TABLE_NAMES VARCHAR(5000))
    
    BEGIN
    DECLARE @ITEMLIST VARCHAR(MAX)
    WHILE CHARINDEX(@SDELIMITER,@SINPUTLIST,0) <> 0
    BEGIN
    SELECT
    @ITEMLIST=RTRIM(LTRIM(SUBSTRING(@SINPUTLIST,1,CHARINDEX(@SDELIMITER,@SINPUTLIST,0)-1))),
    @SINPUTLIST=RTRIM(LTRIM(SUBSTRING(@SINPUTLIST,CHARINDEX(@SDELIMITER,@SINPUTLIST,0)+LEN(@SDELIMITER),LEN(@SINPUTLIST))))
    
    IF LEN(@ITEMLIST) > 0
    INSERT INTO @TABLELIST SELECT @ITEMLIST
    END
    
    IF LEN(@SINPUTLIST) > 0
    INSERT INTO @TABLELIST SELECT @SINPUTLIST
    
    RETURN
    
    END
    
  2. Form&amp;执行删除语句:

    DECLARE @DELETE_STATEMENT VARCHAR(MAX)  
    SELECT @DELETE_STATEMENT =  COALESCE(@DELETE_STATEMENT + ' WHERE BRANCHID <> 0 ; ', '') + 'DELETE FROM '+ TABLE_NAMES FROM DBO.SPLIT_FUNTION(@TABLES,',')
    EXEC (@DELETE_STATEMENT) -- DELETE