logo SQL Prompt教程 我也要发布文档

SQL语法提示工具SQL Prompt使用教程:使用SQL Prompt代码段执行重复任务(下)


SQL Prompt根据数据库的对象名称、语法和代码片段自动进行检索,为用户提供合适的代码选择。自动脚本设置使代码简单易读--当开发者不大熟悉脚本时尤其有用。SQL Prompt安装即可使用,能大幅提高编码效率。此外,用户还可根据需要进行自定义,使之以预想的方式工作。

点击下载SQL Prompt正式版

本教程发现了使用SQL Prompt代码段消除重复执行各种任务的乐趣,这些任务从插入注释标头、创建表到执行有用的元数据查询。本文为该教程后半部分内容,内容紧接前文


用于创建对象的代码片段

每当我创建数据库对象时,无论出于何种原因,该任务通常都会包含一些“重复元素”。例如,当我创建一个表时,它几乎总是具有某些共同的特征,或者每次执行任务时(例如,提取最近添加到表中的所有行以进行报告),我经常需要相同的对象集。

一旦我开始思考我经常执行的任务,有关片段的想法就开始堆积起来!

更有用的“创建表格”代码段

当然,我创建的每个新表的名称和总体结构都不同,但是我们创建的每个表都包含以下共同要求:

  • 代理主键
  • 一列指示何时创建每一行,一列指示何时修改它–这些列中的每一个都会有DEFAULT约束,其中包括表名和列名
  • PAGE 通常将为表启用压缩
在更完整的解决方案中,我可能包含代码以查看表是否已存在、删除表的现有版本、添加扩展属性等等。为了为这些常用表功能创建标准模板,并从任务中删除重复元素,我创建了自定义的createtable代码段,如下所示:
名称:createtable 
说明:LD-Base表使用我们的标准项目创建,并预先填充了
代码段代码:

CREATE TABLE $SchemaName$.$TableName$
(
    $TableName$id         int        NOT NULL CONSTRAINT PK$TableName$ PRIMARY KEY,
    RowCreatedTime      datetime2(0) NOT NULL CONSTRAINT DFLT$TableName$$RowCreatedTime DEFAULT(SYSDATETIME()),
    RowLastModifiedTime datetime2(0) NOT NULL CONSTRAINT DFLT$TableName$$RowLastModifiedTime DEFAULT(SYSDATETIME())
)
WITH (DATA_COMPRESSION = PAGE);

占位符为$SchemaName$和$TableName$,后者重复多次。调用代码段,输入架构名称,然后开始输入表名称,在这种情况下,我将其称为NewTable:

C???\ Users \ drsql \ AppData \ Local \ Microsoft \ Windows \ INetCache \ Content.MSO \ F9AEC943.tmp

当您编辑一个占位符实例时,它们全部都会改变!完成输入名称,然后按Enter:

C???\ Users \ drsql \ AppData \ Local \ Microsoft \ Windows \ INetCache \ Content.MSO \ B0785749.tmp

我可能不会按原样使用代理键,但是我肯定会在表上有一个主键,它将根据此代码段中建立的标准进行命名。在我创建的大多数表中,我还将需要RowCreatedTime和RowLastModifiedTime列。在过去的五年中,我以相同的模式手动创建了数百个(即使不是数千次)默认约束。

自然地,创建表的其余大部分并不是公式化的,无法做成一个片段,但是该片段提供的是通用的重复部分的通用框架。我还创建了列摘要,它们将定义必要的DEFAULT,CHECK或FOREIGN KEY约束及其命名约定(通常包括表名,也许还包括列名)。了解产品信息,请咨询【在线客服】>>>

监视表中创建的行的代码段

下一个示例来自一个项目,在该项目中,我必须准备关于一组表上发生的新活动的每日报告。对于每个表,这需要几个存储过程来获取并保存在特定日期之后添加到基表中的行,以及一个用于存储结果以供报告的“ UsedRows ”表。

对于代码段而言,这是另一项完美的任务,因为尽管替代键的名称和数据类型可能会发生变化,但我们基本上使用同一组对象来获取每个表的数据。

这是代码段的代码:



请注意,这些代码片段足够聪明,可以处理在对象名称和字符串中使用$字符,这是我个人命名风格的一个功能。 参数名称的名称字符中不得包含空格,但是,如果命名标准要求多个$字符而不包含空格字符,则可能会出现问题。了解产品信息,请咨询【在线客服】>>>

执行实用程序代码的工具

当我开始研究如何使用代码片段时,想到的第一件事就是使用它们来执行我经常执行的代码,这些代码是从源代码控制中保存的文件中执行的,通常用于回答有关实例状态或元数据的问题。我想出了两种方法来做到这一点,并且我都成功地运用了这两种方法。

  • 在代码段中使用SQLCMD:r命令从源代码管理中存储的文件列表中访问并执行指定的.sql文件
  • 将所需的SQL捕获到一个片段中,以便您可以获取代码,根据需要对其进行修改并执行它
用于特定脚本的哪种方法取决于您每次运行代码时需要对代码进行更改的可能性。

SQLCMD“剪贴板”代码段

因此,假设您有一整套有用的元数据查询,所有这些查询都可以“按原样”运行,并且每个查询都存储在变更管理系统(GitHub,Dropbox等)中的单独文件中,并且与团队共享。作为一个非常简单的示例,其中一个可能是一个名为CheckLoginSystemCount.sql的文件,该文件报告了SQL Server 的登录计数。

SELECT login_name, COUNT(session_id) AS session_count
FROM sys.dm_exec_sessions
GROUP BY login_name;

我不需要在每个文件中四处寻找,而是创建了一个片段,该片段实际上只是SQLCMD :r命令的列表,每个都指向包含这些元数据查询之一的文件。

名称:querylist 
说明:LD-到常用元数据查询的链接
片段代码:

/******************************************************
Execute queries stored in file system. Use SQLCMD mode to run
******************************************************/
--Use EXIT to make sure you don't accidentally execute everything. EXIT
--in SQLCMD mode will stop processing
EXIT
 
--Check login count
:R E:\Dropbox\Projects\PerformanceTools\CheckLoginSystemCount.sql
EXIT
 
--List locks on the instance
:R E:\Dropbox\Projects\PerformanceTools\ListInstanceLocks.sql
EXIT
--Return size of current database files
:R E:\Dropbox\Projects\Catalog\ListDatabaseConfigurations.sql
EXIT
--Other queries...
EXIT

现在,当您调用该代码片段时,在设置为SQLCMD模式的SSMS查询窗格中,您将获得文件列表。只需突出显示:R指向您要运行的文件的行,它将执行文件中的内容。这些EXIT行确保您不会意外执行每个脚本。

调查锁活动的代码段

我有几个相当复杂的DMV查询,它们经常运行以调查数据库实例上的当前活动。例如,我有一个查询来查看数据库中当前持有的锁。它取自我和Tim Ford十年多以前写的关于DMV的书(尽管它有一些很好的查询仍然是相关的)。

同样,我曾经在源代码管理中将它存储在一个文件中,并根据需要将其搜索出来。90%的情况下,我可以“按原样”运行它,但是对于其他10%,我需要添加过滤器,选择不同的列,等等。令人恼火的是,当我关闭窗口时,我总是保存对原始文件的更改(该文件适用于90%的用例!)

我认为创建包含查询的代码片段比较容易,也许可以使用代码片段参数来简化某些参数的值,然后再运行它。在我的示例中,我为资源类型和SPID设置了占位符,两者均在代码段中默认设置为返回所有值。

名称:locklist 
说明:LD-用于获取当前数据库中连接的锁
代码片段:



现在,我可以调用锁定列表代码片段,执行查询,提供过滤器或让它们使用默认值。如果保存查询,则不会覆盖模板,并且在提交代码时,此更改是否重要没有问题。

请注意,将这样的复杂查询提交给源代码管理仍然很有价值。对于除了最简单的代码段以外的所有代码段,代码段管理器都不应该是基础查询的唯一副本。了解产品信息,请咨询【在线客服】>>>

总结

片段是硬核程序员通常不好称呼的那些事情之一,他们主要认为它们太琐碎,不值得花时间。直到我考虑了如何使用它们来自动化一些重复性任务后,我才意识到它们比我最初预期的更有价值。

我已经演示了几个简单但省时的代码片段,这些代码片段可以消除多余的击键或创建对象,或者可以轻松地重用源代码控制文件中存储的代码,从而使编码变得更容易。

相关内容推荐:

SQL语法提示工具SQL Prompt使用教程:使用SQL Prompt代码段执行重复任务(上)
SQL Prompt使用教程>>>


想要购买SQL Prompt正版授权,或了解更多产品信息请点击【咨询在线客服】