我正在尝试删除某些表的内容。我希望用户选择表名,并将它们连接成一个字符串。例如: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')
执行时会出现相同的错误。 有没有办法做到这一点?感谢您分享宝贵的时间。
答案 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)
您不能从单个查询中删除多个表(除非您的表之间有外键约束并激活约束上的“级联删除”选项)
在您的情况下,最简单的方法是替换逗号,如下所示并使用动态SQL:
DECLARE @CONDITION VARCHAR(255)
SET @CONDITION = ' WHERE BRANCHID <> 0; DELETE FROM '
SET @TABLELIST = 'DELETE FROM ' + REPLACE(@Tables,',',@CONDITION)+' WHERE BRANCHID <> 0;'
EXEC (@TABLELIST)
如果要使用split函数方法,则需要在split函数&amp;中返回Table Names。可以使用动态SQL:
创建函数以返回表名:
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
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