Sql server 在所有表中搜索具有列名的值

Sql server 在所有表中搜索具有列名的值,sql-server,Sql Server,我希望删除选定表中值为的所有行 这会给我所有需要查看的表格 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中的一个值,并删除该行 谢谢您的帮助。您可以使用动态sql生成语句 SELECT

我希望删除选定表中值为的所有行

这会给我所有需要查看的表格

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中的一个值,并删除该行


谢谢您的帮助。

您可以使用动态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
根据你的价值使用适当的铸造。然后,您可以将所有这些语句一起执行(在事务中),或者在需要时逐个执行


如果您想通过脚本完成这一切,您可以使用此答案将结果连接到一个字符串中,然后使用执行生成的脚本。您可以使用动态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
根据你的价值使用适当的铸造。然后,您可以将所有这些语句一起执行(在事务中),或者在需要时逐个执行


如果您想通过脚本完成这一切,可以使用此答案将结果合并为一个字符串,然后使用执行生成的脚本。您可以连接要运行的代码,例如:

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;

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

您可以连接要运行的代码,例如:

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;

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

快速将其组合在一起。在本例中,您将遍历所有表/列,并使用动态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

快把这个拼凑起来。在本例中,您将遍历所有表/列,并使用动态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

下面是使用动态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

下面是使用动态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

当然,这里不需要临时表和循环。但正如所贴的,这是行不通的。#tentable中没有名为id的列。我编辑并添加了列名。我给用户提供了另一个示例,而不是要复制和粘贴的脚本。如果有其他变量列需要清理,他可以将其用作存储过程或其他东西。即使作为存储过程,也不需要循环。:)我明白你的意思了。。。只需创建dynamics sql并运行。。。SET和EXEC行。当然这里不需要临时表和循环。但正如所贴的,这是行不通的。#tentable中没有名为id的列。我编辑并添加了列名。我给用户提供了另一个示例,而不是要复制和粘贴的脚本。如果有其他变量列需要清理,他可以将其用作存储过程或其他东西。即使作为存储过程,也不需要循环。:)我明白你的意思了。。。只需创建dynamics sql并运行。。。设置和执行行。