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

Sql 从用户指定的表中删除内容,sql,sql-server-2008,stored-procedures,Sql,Sql Server 2008,Stored Procedures,我正在尝试删除某些表的内容。我希望用户选择表名,并将它们连接到字符串。例如:Brands、Products、ProductGroups这个字符串被传递到存储过程DBReset。我有一个函数来拆分字符串并将值作为表返回。它很好用。现在我想删除3个表的内容,不包括从名为Split的函数返回的branchID=0的内容。 以下是我尝试过的: CREATE PROCEDURE DBReset (@Tables varchar(200)) AS BEGIN DELETE FROM (SE

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

CREATE PROCEDURE DBReset

        (@Tables varchar(200))
AS
BEGIN
DELETE FROM (SELECT Items FROM [dbo].[Split] (@Tables, ',')) WHERE BranchID<>0
END
然后我尝试了动态sql:

EXEC('DELETE FROM (SELECT Items FROM [dbo].[Split] ('+@Tables+', '','')) WHERE BranchID<>0')
它在执行时给出相同的错误。
有什么可能的方法可以做到这一点吗?感谢您与我们分享宝贵的时间。

您很可能需要迭代拆分的结果集,然后使用exec在循环的当前迭代范围内使用表执行sql,同时添加where子句


您可以通过光标或在while循环中执行此操作。

问题已解决。代码如下:

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似乎更简单。

方法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: 如果要使用拆分函数方法,则需要在拆分函数中返回表名&可以使用动态SQL:

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

SET @TABLELIST = 'DELETE FROM ' + REPLACE(@Tables,',',@CONDITION)+' WHERE BRANCHID <> 0;'
EXEC (@TABLELIST)
创建函数以返回表名:

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
形成并执行删除语句:

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

接受这个答案,因为方法1似乎更简单。