windows server 2012 定时任务执行

Windows Server 2 01 2 task.bat 计划步骤:
打开任务计划程序。
单击创建基本任务。
输入任务名称,例如“备份 PS 数据库”。
设置触发器,例如每天、每周。
选择“启动程序”。
指定.bat 脚本的路径。
配置齐全。
验证执行结果。

sql server 2012之,object_id函数

说实话,刚接手SQL Server项目时,我对OBJECT_ID函数并没有完全理解。
后来有一个场景迫使我深入研究。
记得有一次我们的系统突然报错,说某个视图无效,但是数据库管理员检查了半天也没有反应。
后来发现开发者写了一个存储过程,使用OBJECT_ID来检查视图是否存在。
结果参数写成了“v_audit_费用科目经济分类全名”,中间有空格。
SQL自动将其解析为两个对象名称。
当然找不到ID,返回NULL。

有趣的是,这个函数对我来说最烦人的部分是临时表的处理。
例如,在开发环境中编写测试脚本时,如果直接使用SELECT OBJECT_ID('tempdb..tempTable'),肯定会报错。
您需要编写 SELECT OBJECT_ID('tempdb..[tempTable]')。
方括号简直就是SQL Server特有的固执。
我的一个朋友就因为这个吃了月饼——在生产环境中执行类似指令时,由于权限问题返回了NULL,从而引发了一系列错误,最终整条生产线停了两个小时。

说白了,OBJECT_ID最实际的场景其实就是权限检查之前的安全检查。
我之前负责 ERP 系统,存在需要特定报告视图才能访问财务数据的风险。
我们设计了一个逻辑:在运行报表之前,判断 IF OBJECT_ID('dbo.MyFinancialReportView') IS NOT NULL。
如果对象ID为NULL,则表示视图已被删除或者权限不足,直接阻塞执行。
这比 SQL 中硬编码的权限灵活得多,尤其是在不更改代码的情况下迁移架构时。
然而,这种方法也有缺陷。
例如,管理员意外删除视图后,整个报告模块将不可用,因此需要与常规备份和恢复策略结合使用。

我自己没有运行过,但我记得在 SQL Server 2 008 R2 时代,OBJECT_ID 对系统表的支持还不够完善,无法直接查询 sys.objects。
在以前的版本中,您必须使用 sys.indexes 关联 sys.partitions 才能解决此问题。
那时候写脚本必须使用动态SQL来拼接字符串,这是一项肮脏的工作。
现在看这些旧脚本,它们都写成 OBJECT_ID('dbo.table_name') IS NOT NULL。
其实当时完全可以用IF EXISTS(SELECT FROM sys.tables WHERE name = 'table_name')来代替,性能也好很多。

我几乎从未在参数中使用过object_type。
我只知道有一种情况,我想检查存储过程中的临时表ID,并且应该传递类型“T”。
在一个客户端项目中,我写了一个通用的备份函数,用OBJECT_ID('tempdb..backupTable', 'U')来进行判断。
结果是临时表类型显然是“T”。
通过“T”总是会出错。
我有后来发现需要换成“P”——当时我就很困惑。
最终,数据库专家表示,这是SQL Server区分临时对象类型的形而上学。
我记得微软官方文档中有一个表格列出了所有的type值,但是我找不到具体的版本。
我建议你检查一下。

特别方便的是系统函数可以直接在WHERE子句中使用。
例如,我们团队在编写查询时有一个习惯,首先通过 IF OBJECT_ID('dbo.MyTable') IS NOT NULL 来确认表的存在,以避免运行空表时出错。
但要注意,这会导致生成查询计划时多一层IF判断,从而影响复杂查询的性能。
我的一位同事优化了 SQL,删除了所有这些嵌套判断。
结果,某个报告的执行时间从 5 秒增加到 5 0 秒,最终不得不加回来。
因此,您应该在使用 OBJECT_ID 之前评估场景。

指定临时表时,tempdb..mytemptable的写法其实相当冗长。
除非您在数据库中引用它,否则直接使用 mytemptable 即可。
但是,当临时表名称与系统表同名时存在例外,例如 sysdiagrams。
这种情况下,必须添加tempdb..,否则SQL Server会优先使用内存中的临时表。
我就遇到过一次这种情况。
开发人员将临时表命名为“sysdiagrams”。
结果每次保存的时候都报错,因为备份脚本也用了这个名字——当时真是让人匪夷所思。

最后说一下返回NULL的问题。
空间索引给我留下了深刻的印象。
我们有一个 GIS 项目。
当我们使用sys.spatial.indexes查询地块索引时,OBJECT_ID返回NULL。
经过长时间的检查我们发现索引本身已经损坏了——但是SQL Server不会报告错误并且会默默地返回NULL。
因此,如果使用OBJECT_ID查询表并返回NULL,除了不存在之外,还需要考虑索引损坏或权限不足这两种特殊情况。