我确定这可能是SQL 101,但谷歌搜索仍然会发现创建登录信息'条目。让我快速概述一下。
由于需要比我们的系统提供的更详细的报告,我已经从一般IT支持转向SQL报告。我的公司经营休闲中心,我们非常有助于在70多个地点使用3种不同的休闲管理系统。所有3都是基于SQL的,但以不同的方式完成相同的工作。我已经在SSRS中生成了大量报告,但是我已经完成了2或3次访问所有系统非常非常耗时,只有一个链接断开意味着整个报告无法访问。
向第三方发送数据用于营销目的的请求迫使我们最终考虑集中来自所有系统的数据,以使报告更容易。基本上只有2个表 - 1个用于会员详细信息,1个用于活动。我已经完成了创建视图的困难部分,该视图从3个系统中的每个系统生成相同的信息,并设置中央数据库以将数据恢复。我将在每个系统上运行一个存储过程,该过程将使用前一天的记录填充表。然后,中央服务器上将有一个作业,它将从这些表中复制数据并在传输后将其删除。到目前为止(相对)简单。
问题是中央服务器将尝试从60多台服务器检索数据 - 所有服务器都有自己的网络链接。有些站点是远程的,DSL连接较差,因此有些时候某些数据无法被预定作业复制。我很高兴SQL代理作业可以将这些作为步骤,一个失败的连接不会停止整个过程,但我担心的是,当出现问题时进行故障排除将是棘手的,如果我不能得到某种登录。
存储过程虽然复杂的SQL智能只是更新/插入记录作业。有用的是更新作业以某种方式写入日志文件,报告它影响了20行。插入作业影响了100行。基本的东西,但我不知道我怎么做。当其中一个步骤失败时,某种警告也会有用。 SQL Agent会有所帮助,但我希望在推出到60+服务器阶段之前,在3服务器阶段尽可能多地构建弹性。
任何指向正确方向的人都会非常感激。我的SQL技能是自学的(有很多Stack Overflow帮助!)虽然我在过去几周内学到了很多关于生成复杂视图和查询的知识,但我的大多数SQL都只是查询SSRS所以这就是全部我不知道。
非常感谢。
答案 0 :(得分:0)
output clause将为您提供所需的日志记录功能。它允许你做的是捕获你的陈述正在做什么。下面是如何执行更新并捕获日志记录表中的更改的示例。
至于错误处理和弹性,我会考虑使用SSIS来执行您的ETL。 SSIS为您提供了更强大的错误处理功能集。
-- Create Temp Tables
CREATE TABLE #myLog
(
id int,
oldVal int,
newVal int
);
CREATE TABLE #myTable
(
id int,
val int
);
-- Add Values to #myTable
INSERT INTO #myTable VALUES
(1, 1234),
(2, 1234);
-- Output Contents of #myTable
SELECT * FROM #myTable;
-- Update #myTable & Capture Changes
UPDATE #myTable
SET val = 12345
OUTPUT
inserted.id,
deleted.val,
inserted.val
INTO #myLog
WHERE id = 2
-- Output Contents of #myTable and #myLog
SELECT * FROM #myTable
SELECT * FROM #myLog
-- Drop Temp Tables
DROP TABLE #myLog
DROP TABLE #myTable