SQL Server:搜索所有表中的特定 GUID

2024-02-13

我发现需要清理一些数据,并且我需要找到一些特定的指南(即唯一标识符)在 SQL Server°。

我想出了一个存储过程SELECT从当前数据库中每个表的每个 uniqueidentifier 列中查找,如果找到 guid,则返回一个结果集。

它使用 INFORMATION_SCHEMA 视图来查找所有唯一标识符全部列基表(与视图相对)。对于每一列,它发出一个选择,返回表的名称和找到它的列。

CREATE PROCEDURE dbo.FindGUID @searchValue uniqueidentifier AS
/*
    Search all tables in the database for a guid

      6/9/2009: Removed the IF EXISTS to double hit the database
*/

--DECLARE @searchValue uniqueidentifier
--SET @searchValue = '{2A6814B9-8261-452D-A144-13264433864E}'

DECLARE abc CURSOR FOR
    SELECT 
        c.TABLE_NAME, c.COLUMN_NAME
    FROM INFORMATION_SCHEMA.Columns c
        INNER JOIN INFORMATION_SCHEMA.Tables t
        ON c.TABLE_NAME = t.TABLE_NAME
        AND t.TABLE_TYPE = 'BASE TABLE'
    WHERE DATA_TYPE = 'uniqueidentifier'

DECLARE @tableName varchar(200)
DECLARE @columnName varchar(200)
DECLARE @szQuery varchar(8000)

OPEN ABC

FETCH NEXT FROM abc INTO @tableName, @columnName
WHILE (@@FETCH_STATUS = 0)
BEGIN
    SET @szQuery = 
        'SELECT '''+@tableName+''' AS TheTable, '''+@columnName+''' AS TheColumn '+
        'FROM '+@tableName+' '+
        'WHERE '+@columnName+' = '''+CAST(@searchValue AS varchar(50))+''''

    PRINT 'Searching '+@tableName+'.'+@columnName+'..'
    PRINT @szQuery
    EXEC (@szQuery)

    FETCH NEXT FROM abc INTO @tableName, @columnName
END

CLOSE abc
DEALLOCATE abc  

我的问题是:

问题1
任何人都可以找到一种方法来更改它以执行对同一个表中的多个 uniqueidentifier 列的 OR 搜索,而不是单独的查询

i.e.

SELECT ... FROM Prices WHERE BookGUID = '{...}'
SELECT ... FROM Prices WHERE AuthorGUID = '{...}'
SELECT ... FROM Prices WHERE PublisherGUID = '{...}'
SELECT ... FROM Prices WHERE StoreGUID = '{...}'

会成为:

SELECT ... 
FROM Prices 
WHERE BookGUID = '{...}'
OR AuthorGUID = '{...}'
OR PublisherGUID = '{...}'
OR StoreGUID = '{...}'

我尝试在游标内使用游标,但是FETCH_STATUS的冲突。

问题2谁能想到更好的方法吗?‡


脚注:

° SQL Server 2000

‡ 受到在关系数据库中使用唯一标识符的约束。


您可以推迟执行,直到光标循环完成。然后,只需跟踪循环内的表名称,如果相同,则添加一个 OR,否则结束 SELECT 并开始新的 SELECT。

DECLARE @lasttable varchar(255);
SET @lasttable='';
FETCH NEXT FROM abc INTO @tableName, @columnName;
WHILE (@@FETCH_STATUS = 0)
BEGIN
   IF(@lasttable=@tablename) BEGIN
       SET @szQuery = @szQuery + ' OR [' + @columnName + ']=''' + CAST(@searchValue AS varchar(50)) + '''';
   END ELSE BEGIN
       SET @lasttable = @tablename;
       SET @szQuery = @szQuery + 
         'SELECT '''+@tableName+''' AS TheTable, '''+@columnName+''' AS TheColumn '+
         'FROM '+@tableName+' '+
         'WHERE '+@columnName+' = '''+CAST(@searchValue AS varchar(50))+''''
   END
   FETCH NEXT FROM abc INTO @tableName, @columnName;
END
PRINT @szQuery;
EXEC (@szQuery);

您还可以创建存储过程来构建一个 VIEW,该 VIEW 对所有表和 uniqueidentifier 字段执行 UNION ALL。具有这样的架构的东西:

CREATE VIEW all_uuids AS (
    SELECT 'prices' AS tablename, 'BookGUID' as fieldname, ID as primarykey, BookGUID AS guid FROM prices
    UNION ALL SELECT 'prices', 'AuthorGUID', ID, AuthorGUID FROM prices
    UNION ALL SELECT 'othertable', 'otherfield', ID, otherfield FROM othertable
    )

然后,您只需在此可重用的 VIEW 上执行单个 SELECT 语句即可获取所有匹配的 GUID。要在单个表中搜索,请使用相关子查询,例如:

SELECT * FROM prices WHERE EXISTS (SELECT null FROM all_uuids u WHERE u.primarykey=prices.id AND u.guid=@searchfor AND u.tablename='prices')

这将搜索价格表中的所有 GUID 字段。 SQL Server 足够智能,不会查找其他表,而是使用现有表的索引。

通过重用单个视图,您只需在更改架构时循环访问 information_schema,而不是每次查询,并且视图的结果比存储过程的结果更容易连接。


Answer

原始海报最终解决方案基于此答案:

CREATE PROCEDURE dbo.FindGUID @searchValue uniqueidentifier AS

/*
    Search all tables in the database for a guid

    Revision History
    6/9/2009: Initally created
    6/10/2009: Build or clause of multiple columns on one table
*/

--DECLARE @searchValue uniqueidentifier
--SET @searchValue = '{2A6814B9-8261-452D-A144-13264433864E}'

DECLARE abc CURSOR FOR
    SELECT 
        c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME
    FROM INFORMATION_SCHEMA.Columns c
        INNER JOIN INFORMATION_SCHEMA.Tables t
        ON c.TABLE_NAME = t.TABLE_NAME
        AND t.TABLE_TYPE = 'BASE TABLE'
    WHERE DATA_TYPE = 'uniqueidentifier'

DECLARE @tableSchema varchar(200)
DECLARE @tableName varchar(200)
DECLARE @columnName varchar(200)
DECLARE @szQuery varchar(8000)
SET @szQuery = ''

DECLARE @lasttable varchar(255);
SET @lasttable='';

OPEN ABC

FETCH NEXT FROM abc INTO @tableSchema, @tableName, @columnName;
WHILE (@@FETCH_STATUS = 0)
BEGIN
   IF(@lasttable=@tablename) 
   BEGIN
      SET @szQuery = @szQuery + ' OR [' + @columnName + ']=''' + CAST(@searchValue AS varchar(50)) + '''';
   END 
   ELSE 
   BEGIN
       SET @lasttable = @tablename;

       IF @szQuery <> '' 
       BEGIN
          PRINT @szQuery
          EXEC ('IF EXISTS (' + @szQuery + ') BEGIN ' + @szQuery + ' END');
       END

       SET @szQuery = 
         'SELECT '''+@tableSchema+'.'+@tableName+''' AS TheTable, '''+@columnName+''' AS TheColumn '+
         'FROM '+@tableName+' '+
         'WHERE '+@columnName+' = '''+CAST(@searchValue AS varchar(50))+''''
   END
   FETCH NEXT FROM abc INTO @tableSchema, @tableName, @columnName;
END

CLOSE abc
DEALLOCATE abc

IF @szQuery <> '' 
BEGIN
    PRINT @szQuery
    EXEC ('IF EXISTS (' + @szQuery + ') BEGIN ' + @szQuery + ' END');
END
GO
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server:搜索所有表中的特定 GUID 的相关文章

  • 在ASP CLASSIC中使用SQL参数,对象定义不正确错误

    我试图使用参数保护我的 INSERT 语句免受 SQL 注入 但由于某种原因我收到错误 Parameter object is improperly defined Inconsistent or incomplete informatio
  • 如何处理用户界面中的数据库约束违规?

    我们使用存储过程在数据库中实现大部分业务规则 我永远无法决定如何最好地将数据约束违规错误从数据库传递回用户界面 我所说的约束更多地与业务规则相关 而不是与数据完整性相关 例如 诸如 无法插入重复的键行 之类的数据库错误与业务规则 不能有多个
  • 使用 Python 中的 SQL Server 存储过程 (pyodbc)

    我有一个存储过程 代码 DECLARE RC int DECLARE id varchar 13 DECLARE pw varchar 13 DECLARE depart varchar 32 DECLARE class varchar 1
  • 使用 WHILE 创建虚拟数据

    我尝试使用 a 在表中插入一些虚拟数据WHILE 但它运行得非常非常慢 我在想也许我写的代码不正确 你能看一下并确认一下吗 Insert dummy data DECLARE i int Content int SET i 5001 WHI
  • 无法在 SSIS 2012 上使用敏感项目参数

    在 SSIS 2012 中 我尝试对 Oracle 的 OLEDB 连接使用敏感项目参数 它与 Sensitive 属性设置为完美配合FALSE 在项目参数设计器中 但我不希望密码像那样可见 一旦我将敏感属性设置为TRUE并尝试执行我的包
  • 如何从经典 ASP 读取 SQL Always-加密列

    我维护一个经典的 ASP 应用程序 是的 我知道 我们正在开发它 并且需要访问 SQL 2017 中的 Always Encrypted 列 我已经导入了证书并在 SSMS 和 PowerShell 中进行了测试 这很有效 我在 ASP 中
  • 如何在 SQL Server 中的特定字符后分割字符串并将该值更新到特定列

    我有包含数据的表格1 1 to 1 20在一列中 我想要值 1 到 20 即 前斜杠 之后的值更新到 SQL Server 中同一表中的其他列 Example 专栏有价值1 1 1 2 1 3 1 20新列值1 2 3 20 也就是说 我要
  • 获取家庭成员

    假设以下家庭 其构建架构是 create table PersonConn child int parent int insert into PersonConn values 1 2 insert into PersonConn valu
  • 如何使用 DateTime 执行 SQL NOT NULL?

    一个人如何处理DateTime with a NOT NULL 我想做这样的事情 SELECT FROM someTable WHERE thisDateTime IS NOT NULL But how 嗯 它有效吗 我刚刚测试过 Obje
  • 在 SQL Server 中处理日期

    我正在开发一个 ASP NET 网站 我从网页获取日期 然后根据用户输入我想从 SQL Server 数据库获取结果 使用存储过程 问题是我只能从用户界面获取这种格式的日期2016 10 08这是字符串类型 但在数据库中 我有一个类型为da
  • 存储过程和权限 - EXECUTE 就足够了吗?

    我有一个 SQL Server 2008 数据库 其中对基础表的所有访问都是通过存储过程完成的 一些存储过程只是从表中选择记录 而其他存储过程则进行 UPDATE INSERT 和 DELETE 如果存储过程更新表 执行存储过程的用户是否也
  • 在 Sql Server 中转换为日期时间 MM/dd/yyyy HH:mm:ss

    如何将给定的日期格式转换为MM dd yyyy HH mm ss 我尝试了下面这个但没有实现 谁能帮我 SELECT CONVERT VARCHAR 20 GETDATE 120 SQL Server 2005及以上版本支持 SELECT
  • 了解 SSMS 2008 中关系的更新和删除规则

    当我们定义外键约束时 我对 SQL Server 2008 Management Studio 中的更新和删除规则的含义感到困惑 我也没有找到相关的帮助文档 例如F1帮助 这是屏幕快照 如果有人能描述它们的含义并推荐一些相关文档来阅读 我将
  • 实体框架 - SQL Server 2005 - IIS 服务器日期时间问题

    我正在使用 MVC3 和实体框架 在我的应用程序中 我需要通过 EF 调用 SQL Server 2005 中的存储过程来根据以下内容搜索一些数据datetime传递的参数 在当地环境中一切似乎都运行良好 但是将其托管到 IIS 后 我在尝
  • 如何在 SQL Server 存储过程中对用户定义的表类型执行 ForEach?

    XX PROCEDURE dbo XXX X dbo IntType readonly AS BEGIN SET NOCOUNT ON how can I foreach X here and do process individually
  • 在 C#.NET 应用程序中使用 SQL Server 时间数据类型?

    如何使用 SQLtimeSQL Server 2008 中 C NET 中引入的数据类型 我一直在努力让它发挥作用 但没有成功 这是一个MSDN 文章 http msdn microsoft com en us library bb6751
  • 在 SQL 2005+ 中,CLR 存储过程是否优于 TSQL 存储过程?

    我目前的观点是否定的 更喜欢 Transact SQL 存储过程 因为它们是重量更轻且 可能 性能更高的选项 而 CLR 过程允许开发人员进行各种恶作剧 然而最近我需要调试一些写得非常糟糕的 TSQL 存储过程 像往常一样 我发现许多问题是
  • 临时表是线程安全的吗?

    我正在使用 SQL Server 2000 它的许多存储过程广泛使用临时表 数据库的流量很大 我担心创建和删除临时表的线程安全性 假设我有一个存储过程 它创建了一些临时表 它甚至可以将临时表连接到其他临时表等 并且还可以说两个用户同时执行存
  • SQL 国家字符 (NCHAR) 数据类型的真正用途是什么?

    也CHAR CHARACTER and VARCHAR CHARACTER VARYING SQL 提供了NCHAR NATIONAL CHARACTER and NVARCHAR NATIONAL CHARACTER VARYING 类型
  • Laravel 搜索关系

    我有两个相关的模型 我正在尝试在产品中进行搜索 并且仅显示实际搜索结果 而不是找到该产品的类别的所有产品 我不想搜索任何类别 因为无论搜索什么或找到什么 类别都会始终显示 Example I have the following categ

随机推荐

  • 如何判断我的 IE 是否是 64 位? (就此而言,Java 也是如此吗?)

    网络上已经有数以百万计的问题涉及如何判断操作系统是否是 64 位 但不知道 IE 和 或 Java 运行时是否是 64 位 一些背景 我安装了 64 位 Win 7 IE 会自动从 CD 中安装 我没有下载IE 我确实下载了Java运行时
  • 我们如何在 Comparator.comparing 中传递变量字段/方法名称

    我有一个Report String name Date date int score 班级 我希望能够使用新的 java 8 语法对任何成员变量的报告列表进行排序 所以java 8提供了这个新的 list sort Comparator c
  • Android studio 虚拟设备未加载

    我有 4GB 内存 android studio 虚拟设备显示 ANDROID 所以加载是无限的 它没有结束 我已经等太久了 可能是什么问题 无论我使用什么应用程序 您尝试过使用 Genymotion 吗 它比普通虚拟设备好数百倍 这里有一
  • Ruby - 将目录添加到 $LOAD_PATH - 它有什么作用?

    这实际上是关于这个问题的一个问题 将目录添加到 LOAD PATH Ruby https stackoverflow com questions 837123 adding a directory to load path ruby 将目录
  • 使用 gulp 创建 tar 档案

    我正在使用 gulp tar 创建一个 tar 文件 如何添加顶级文件夹 以便当用户运行时tar xzf myArchive tar它解压到特定的文件夹中 这是我的代码 gulp task prod min gittag function
  • div 向下滑动时自动聚焦在输入字段上

    我有一个隐藏的div 单击按钮时 div 会向下滑动并带有输入字段 如何让这个输入框在 div 向下滑动时自动对焦 谢谢
  • sphinx autodoc包含子功能

    我想在 sphinx 文档中自动包含函数的子函数 有什么选择呢 我的代码看起来像 import numpy def mainfunc to be documented def subfunc to be documented as well
  • PCRE pcre_exec 线程安全吗?

    我有一个 C 程序 它使用 PCRE 正则表达式来确定 cgroup 中的进程是否应添加到一个变量或另一个变量 我生成一个线程来读取每个正在运行的 cgroup 中的 cpuacct stat 文件 其中线程数从未超过核心数 然后将这些样本
  • Haskell 中的 S 组合器

    可以模拟一下S组合器 https en wikipedia org wiki SKI combinator calculus仅使用标准函数 不通过方程定义 并且不使用 lambda 匿名函数 在 Haskell 中表达 我希望它能按类型 a
  • Facebook“点赞”推荐点击添加变量;无法识别链接的页面作为喜欢的页面

    所以我有一个网站 我们称之为foo com并且所有页面都有点赞按钮插件 https developers facebook com docs reference plugins like 在上面 每个页面上都重新散列相同的代码 所以我 喜欢
  • 如何在 Vue 中条件绑定 v-model?

    在 JavaScript 中 对象可以选择扩展值 如下所示 const payload name Joseph isMember credential true 在 React 中 JSX 可以像这样可选地传递 props
  • 如何使用 SetConsoleHandler() 阻止退出调用

    我知道我必须使用SetConsoleCtrlHandler 如果我想管理控制台关闭事件 不知道怎么屏蔽CTRL CLOSE EVENT 我尝试过如果捕获该事件则返回 false true 但没有成功 这是我到目前为止所得到的 谢谢 Anto
  • 设置运行/段落样式以支持 RTL 和 LTR 单词

    我怎样才能设计一个Run and or Paragraph支持 RTL 和 LTR 字 问题是 我有一个复杂的文本 其中包含波斯语和英语单词 我正在尝试创建一个 docx使用 OpenXML SDK 的文档 但是 英语单词也可以得到 RTL
  • 对 PowerPC 寄存器值感到困惑)?

    所以 我一直在学习 PowerPC 来完成 Xbox 的简单逆向项目 但我总是对这样的事情感到困惑 lwz r11 0 r29 Loads 0x34 from 0x10710 and stores in r11 lwz r10 4 r29
  • android:如何使用属性集构造函数实例化我的自定义视图

    我的自定义视图具有动态自定义属性 例如背景图像属性 通过当前星期分配 我不想使用构造函数 CalendarView Context context AttributeSet attrs 来传递多个属性 并且我尝试使用 Xml asAttri
  • Tomcat 7 作为 Windows 服务无法从其他系统访问

    我已经下载了适用于 32 位 Windows 7 机器的 Tomcat 7 zip 我已经解压了该包并使用 bin service bat 创建了 Windows 服务 但是当我从 windows services msc 启动服务时 我无
  • 在远程 ssh 命令中传递变量

    我希望能够使用 ssh 从我的机器运行命令并传递环境变量 BUILD NUMBER 这就是我正在尝试的 ssh email protected cdn cgi l email protection tools myScript pl BUI
  • 为树状图中的刻度标签着色以匹配簇颜色

    如何为树状图的标签单独着色 使其与 MATLAB 中簇的颜色相匹配 这是使用下面我的答案中的代码生成的所需输出示例 请注意 标签只是 50 个字符系列 A r 如果有更直接的方法来做到这一点 请发布答案 因为我无法通过谷歌搜索找到解决方案
  • 两个节点之间的设备树依赖关系

    我有两个设备树节点 一个设置 GPIO 引脚 另一个配置一个 i2c 总线 例如 gpio2 en gpio gpio hog gpios lt 5 0 gt output high i2c1 gpiom1 gpio 27 compatib
  • SQL Server:搜索所有表中的特定 GUID

    我发现需要清理一些数据 并且我需要找到一些特定的指南 即唯一标识符 在 SQL Server 我想出了一个存储过程SELECT从当前数据库中每个表的每个 uniqueidentifier 列中查找 如果找到 guid 则返回一个结果集 它使