在SQL中,如何使用临时存储过程在数据库的所有表中搜索值?
我有多个数据库,我想创建一个临时存储过程SearchAllTables,在数据库的所有表中搜索一个值 我面临的问题是,如果我针对主数据库创建临时存储过程,那么当我针对另一个数据库运行它时,它将不起作用,因为它不会显示任何结果 如果我针对特定的数据库创建相同的temp存储过程,它就可以正常工作 我正在使用此网站中的存储过程:在SQL中,如何使用临时存储过程在数据库的所有表中搜索值?,sql,sql-server,database,Sql,Sql Server,Database,我有多个数据库,我想创建一个临时存储过程SearchAllTables,在数据库的所有表中搜索一个值 我面临的问题是,如果我针对主数据库创建临时存储过程,那么当我针对另一个数据库运行它时,它将不起作用,因为它不会显示任何结果 如果我针对特定的数据库创建相同的temp存储过程,它就可以正常工作 我正在使用此网站中的存储过程: 您知道我为什么会有这种行为吗?查看存储过程,当应用于主数据库时,过程代码第33行上的过滤器似乎就是问题所在: 对象属性 对象ID QUOTENAMETABLE“U模式+”。
您知道我为什么会有这种行为吗?查看存储过程,当应用于主数据库时,过程代码第33行上的过滤器似乎就是问题所在: 对象属性 对象ID QUOTENAMETABLE“U模式+”。+QUOTENAMETABLE“U名称 “IsMSShipped” = 0 主数据库中的表都随MS SQL安装一起提供,因此IsMSShipped属性将等于1,因此将从搜索中排除。您可以通过运行以下命令进行测试: 选择 *, OBJECTPROPERTYOBJECT“U IDQUOTENAMETABLE”模式+“+QUOTENAMETABLE”名称“IsMSShipped” 从…起 master.INFORMATION\u SCHEMA.TABLES
如果要搜索这些表,请从WHERE子句中删除该筛选器。查看存储过程,过程代码第33行的此筛选器似乎是应用于主数据库时的问题: 对象属性 对象ID QUOTENAMETABLE“U模式+”。+QUOTENAMETABLE“U名称 “IsMSShipped” = 0 主数据库中的表都随MS SQL安装一起提供,因此IsMSShipped属性将等于1,因此将从搜索中排除。您可以通过运行以下命令进行测试: 选择 *, OBJECTPROPERTYOBJECT“U IDQUOTENAMETABLE”模式+“+QUOTENAMETABLE”名称“IsMSShipped” 从…起 master.INFORMATION\u SCHEMA.TABLES
如果要搜索这些表,请从WHERE子句中删除该筛选器。免责声明:这是一项非常繁重的任务。我不建议在生产环境中运行 您引用的代码仅用于查询当前数据库中的表 : 为当前数据库中当前用户具有权限的每个表或视图返回一行 如果您想让它在每个数据库中运行,就必须修改它,使其在所有数据库中循环。大概是这样的:
DECLARE @dbName NVARCHAR(256)
DECLARE db_cursor CURSOR FOR
SELECT name
FROM sys.databases
WHERE state_desc = 'ONLINE'
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbName
WHILE @@FETCH_STATUS = 0
BEGIN
--Code from proc here
END
然后,您需要修改将@TableName变量放在一起的查询,以包括数据库名称:
...
BEGIN
SET @ColumnName = ''
SET @TableName =
(
SELECT QUOTENAME(@dbName)+ '.' + MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(
OBJECT_ID(
QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
), 'IsMSShipped'
) = 0
)
WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
...
免责声明:这是您要求执行的非常密集的任务。我不建议在生产环境中运行 您引用的代码仅用于查询当前数据库中的表 : 为当前数据库中当前用户具有权限的每个表或视图返回一行 如果您想让它在每个数据库中运行,就必须修改它,使其在所有数据库中循环。大概是这样的:
DECLARE @dbName NVARCHAR(256)
DECLARE db_cursor CURSOR FOR
SELECT name
FROM sys.databases
WHERE state_desc = 'ONLINE'
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbName
WHILE @@FETCH_STATUS = 0
BEGIN
--Code from proc here
END
然后,您需要修改将@TableName变量放在一起的查询,以包括数据库名称:
...
BEGIN
SET @ColumnName = ''
SET @TableName =
(
SELECT QUOTENAME(@dbName)+ '.' + MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(
OBJECT_ID(
QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
), 'IsMSShipped'
) = 0
)
WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
...
如何执行临时存储过程?您是如何针对其他数据库运行它的?类似这样的用法使用[DBName]GO EXEC SearchAllTables@SearchStr=N'stringtest'您是如何执行临时存储过程的?您是如何在其他数据库上运行它的?类似这样的用法使用[DBName]GO EXEC SearchAllTables@SearchStr=N'stringtest'