当前位置: 首页 > 面试题库 >

对没有动态SQL的多个表运行相同的查询

东方俊材
2023-03-14
问题内容

我支持第三方软件包的SQLhtml" target="_blank">数据库。他们有很多所谓的“影子表”,实际上只是审计表。一切都很好,但是他们的系统不会清理这些表,所以我需要这样做。他们还将在每次升级时添加新的“影子表”,而无需另行通知。我们清除表的旧方法是使用一长串DELETE FROM语句,但是此列表变得非常长且难以维护。

为了使清除过程更易于维护并自动捕获新的“影子表”,我编写了以下存储过程。存储过程可以工作,但是我更想找出一种不使用游标和动态查询的方法,因为它将每天在许多不同的表上运行。有没有使用游标和动态查询的替代方法吗?

DECLARE @workingTable varchar(128);
DECLARE @sqlText varchar(250);
DECLARE @CheckDate DATETIME = DATEADD(yy, -2, GETDATE());

DECLARE curKey SCROLL CURSOR FOR  
SELECT name AS TableName
FROM dataTEST.sys.tables
WHERE (name like '%[_]h' OR name like '%[_]dh')
ORDER BY name

OPEN curKey
WHILE @@fetch_status = 0
BEGIN
    FETCH NEXT FROM curKey INTO @workingTable
    SET @sqlText = 'DELETE FROM DataTEST.dbo.' + @workingTable + ' WHERE LAST_MOD < ''' + CONVERT(CHAR(10), @CheckDate, 101) + ''';'
    --PRINT @sqlText
    EXEC (@sqlText)
END
CLOSE curKey
DEALLOCATE curKey

问题答案:

无论如何,当您提前不知道表名时,无论如何我都不知道要摆脱动态SQL。SQL
Server具有一项功能,您可以在select语句中对返回的每一行进行一次变量分配。这可用于消除游标并将带有所有delete语句的一个字符串传递给SQL
Server以执行

DECLARE @sqlText nvarchar(MAX) = ''; -- initialize because NULL + 'x' is NULL
DECLARE @CheckDate DATETIME = DATEADD(YEAR, -2, GETDATE());

SELECT @sqlText = @SqlText + 'DELETE FROM dataTEST.dbo.' + QUOTENAME(name) 
    + ' WHERE LAST_MOD < @CheckDate ; '
FROM dataTEST.sys.tables
WHERE (name like '%[_]h' OR name like '%[_]dh')
ORDER BY name

IF @@ROWCOUNT > 0 
    EXEC sp_executesql @sqlText
        , N'@CheckDate DATETIME'
        , @CheckDate


 类似资料:
  • 问题内容: 我有一个数据库,每天在其中创建一个表来记录流程实例。这些表标记为MESSAGE_LOG_YYYYMMDD 目前,我想针对所有这些表顺序执行相同的QUERY。我在下面编写了PL / SQL,但陷入了第10行。如何针对此处的所有表成功执行SQL语句? 问题答案: http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96590/a

  • 问题内容: 我正在尝试调整SQL查询以检查服务器上每个数据库中存在的特定字段中存在的值。 有100个单独的数据库,我想检查每个数据库的特定记录。 答案可能是使用下面的命令,但是我很难适应它。 我在下面的链接上获得了更大的成功; https://stackoverflow.com/a/18462734/3461845 我需要能够执行以下查询: 并且还为返回的每一行拉回数据库的名称; 任何帮助是极大的

  • 我为每个日期创建了多个表来存储每个日期的一些信息。例如历史3108、历史0109..所有这些表共享相同的模式。有时候,我需要查询多个表,获取记录的行数和计数。在oracle和SQL Server中,最快的方法是什么? 目前我正在这样做。。。 当我需要多个表的计数时:为每个表选择计数(*),然后添加 当我需要多个表的记录时:从表1中选择*,从表2中选择*(基本上为每个表选择*) 如果我们在一个事务中

  • 问题内容: 在testng套件中运行时,有没有一种方法可以将同一webdriver对象用于多个测试/类?我的意思是从一个类开始WebDriver实例,但是在套件的后续类/测试中继续使用它? 我面临的问题是10个differect类具有以下语句: WebDriver驱动程序=新的FirefoxDriver(); 并且即使在我将并行模式设置为false的情况下限制TestNG之后,它也会打开10个不同

  • 问题内容: 我有两个表A和Band,A与B之间的关系是A —>一对多—> B 通常,对于A的每条记录,我都有一个B的记录。 我正在尝试编写一个查询,该查询将为我提供A的 唯一 记录列表,其中B中的 记录 超过 一个(多个) 。 我很困惑,因为我只完成了基本的sql查询,而这对我来说似乎很复杂。 可以请一个人指导我正确答案或给我解决方案。 编辑: 好吧,我尝试了下面的事情,它给了我一个错误 从A a

  • 问题内容: 我遇到一个问题,当执行两个表的联接时,无法确定mysql查找具有两个特定“标签”和相同“ hashid”的链接 假设我的表看起来像这样: 链接 标签 我想返回同时具有“有用”和“很棒”标签的行 当前(工作/快速)查询,用于按1个标签查找链接: 阅读文章后,我尝试使用以下内容: 这 不 工作,但它是如此令人难以置信的缓慢,因为无法使用。 有人知道解决方案吗? 问题答案: 问题的类型称为