2017-03-06 137 views
1

我正在删除值为=的所选表格中的所有行。在所有表格中搜索具有列名称的值

这会给我,我需要在

SELECT t.name AS table_name 
    FROM sys.tables AS t 
    INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID 
    WHERE c.name = 'CampusID' 
    ORDER BY table_name 

看但现在我想每个搜索这些表在CampusID值,并删除该行的所有表。

感谢您的帮助。

回答

0

您可以使用动态SQL语句生成给出

你的价值
SELECT 
'delete from ' + t.name + ' where CampusId = ' + cast(123 as varchar(8)) 
    FROM sys.tables AS t 
    INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID 
    WHERE c.name = 'FundID' 
    ORDER BY t.name 

使用适当的铸造。然后,您可以将所有这些语句一起(在一个事务中)一起执行,或者如果需要一个一个地执行它们。

如果你想这样做所有通过脚本,你可以使用这个答案How to concat many rows into one string in SQL Server 2008?加入结果成一个字符串,然后使用sp_executesql执行脚本生成

0

你可以串连你想要的代码运行,如:

SELECT 'DELETE FROM ' + QUOTENAME(t.name) + 
     ' WHERE ''CampusID'' = YourValue;' AS table_name 
FROM sys.tables AS t 
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID 
WHERE c.name = 'CampusID' 
ORDER BY table_name; 

然后复制粘贴的结果,并运行它

0

抛出此在一起快。在这里,你将遍历所有的表/列,并使用动态sql删除需要转换的值。我使用这样的查询来做你想做的事。我没有测试这个实际的查询,所以你必须把它解决到你需要的东西。

DECLARE @loopCount  INT 
DECLARE @tableName  NVARCHAR(128) 
DECLARE @columnName  NVARCHAR(128) 
DECLARE @strSQL   NVARCHAR(MAX); 

CREATE TABLE #tempTable (id INT IDENTITY(1,1), tableName VARCHAR(128), tableCol VARCHAR(128) 

INSERT INTO #tempTable(tableName, tableCol) 
SELECT t.name AS table_name, c.name 
FROM sys.tables AS t 
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID 
WHERE c.name = 'CampusID' 

--Set a loopCount for while loop 
SET @loopCount = 1 

    --Use the while loop to to loop through tables 
     while (exists(SELECT id FROM #tempTable WHERE id = @loopCount)) 
      BEGIN 

       --Get current record in temp table 
       SELECT @tableName  = t.tableName 
         @columnName  = t.tableCol 
       FROM #tempTable t 
       WHERE t.id = @loopCount 
       -----------------------------------------------------------   

       SET @strSQL = 'DELETE FROM ' + @tableName + ' WHERE ' + @columnName + ' = ' + CONVERT(NVARCHAR(MAX), VALUEHERE) 
       EXEC sp_executesql @strSQL, N'@tableName varchar(128), @columnName varchar(128)', @tableName = @tableName, @columnName = @columnName 

       DELETE FROM #tempTable WHERE id = @loopCount 

       SET @loopCount = @loopCount + 1 
      END 


DROP TABLE #temptable 
+0

当然不需要临时表和循环这里。但是,张贴这不起作用。 #tempTable中没有名为id的列。 –

+0

我编辑并添加了列名。我给用户另外一个例子来复制和粘贴脚本。如果他有其他可变列进行清理,他可以将其用作存储过程或其他东西。 – manderson

+0

即使作为存储过程,也不需要循环。 :) –

0

以下是使用动态sql完成此任务的完整示例。

declare @SQL nvarchar(max) = N'' 
    , @ValueToDelete nvarchar(25) = N'Some Value' 

SELECT @SQL = @SQL + N'DELETE FROM ' + QUOTENAME(t.name) + 
     N' WHERE CampusID = ''' + @ValueToDelete + N''';' 
FROM sys.tables AS t 
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID 
WHERE c.name = 'CampusID' 

exec sp_executesql @SQL 
相关问题