Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中,如何使用临时存储过程在数据库的所有表中搜索值?_Sql_Sql Server_Database - Fatal编程技术网

在SQL中,如何使用临时存储过程在数据库的所有表中搜索值?

在SQL中,如何使用临时存储过程在数据库的所有表中搜索值?,sql,sql-server,database,Sql,Sql Server,Database,我有多个数据库,我想创建一个临时存储过程SearchAllTables,在数据库的所有表中搜索一个值 我面临的问题是,如果我针对主数据库创建临时存储过程,那么当我针对另一个数据库运行它时,它将不起作用,因为它不会显示任何结果 如果我针对特定的数据库创建相同的temp存储过程,它就可以正常工作 我正在使用此网站中的存储过程: 您知道我为什么会有这种行为吗?查看存储过程,当应用于主数据库时,过程代码第33行上的过滤器似乎就是问题所在: 对象属性 对象ID QUOTENAMETABLE“U模式+”。

我有多个数据库,我想创建一个临时存储过程SearchAllTables,在数据库的所有表中搜索一个值

我面临的问题是,如果我针对主数据库创建临时存储过程,那么当我针对另一个数据库运行它时,它将不起作用,因为它不会显示任何结果

如果我针对特定的数据库创建相同的temp存储过程,它就可以正常工作

我正在使用此网站中的存储过程:


您知道我为什么会有这种行为吗?

查看存储过程,当应用于主数据库时,过程代码第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'