我在SSIS中构建一个包,该包首先从另一个服务器获取源数据并加载到我的服务器中。从那里我有另一个包来操作这个源数据并加载一个新表。
我想阻止这种操纵'如果我的消息来源失败,请运行包裹。包。我可以说出来,但不能语法化......
如果MyTABLE存在并且从MyTABLE计数(*)> 0然后' GOOD'别的'坏'如果有什么事情发生变坏,我将会遇到一个不能运行其余软件包的约束。如果这是实现这一目标的愚蠢方式,那么请告诉我实现这一目标的更简单方法。
最终目标是列出一个“好”的列表。或者'坏'并且表名作为下一列,所以如果有任何失败,我可以收到一封我的查询电子邮件,它会很快告诉我什么是坏的,什么是好的。
Source_Check Source_Table
GOOD TABLE1
BAD TABLE2
GOOD TABLE3
等.....
我的问题是我从一个不存在的表中尝试计算(*)时遇到错误...不确定如何克服这个问题:(
可能有更简单的方法来解决这个问题,我只是一个新手。可以将我的搜索权限用于从谷歌获取任何结果。
答案 0 :(得分:2)
元数据将成为你的朋友。假设SQL Server,您可以编写一个简单的查询,如
SELECT
*
FROM
sys.schemas AS S
INNER JOIN sys.tables AS T
ON T.schema_id = S.schema_id
WHERE
S.name = N'dbo'
AND T.name = N'SomeTable';
如果返回结果,则表示您的表存在。
SELECT COUNT(*)的问题是该表必须存在。它还会阻止您抓取表格。有解决这个问题的技巧,但我最喜欢的是回到元数据。看看this query。它将立即生成所有表及其行数的列表。
SELECT
s.[Name] as [Schema]
, t.[name] as [Table]
, SUM(p.rows) as [RowCount]
FROM
sys.schemas s
LEFT OUTER JOIN
sys.tables t
ON s.schema_id = t.schema_id
LEFT OUTER JOIN
sys.partitions p
ON t.object_id = p.object_id
LEFT OUTER JOIN
sys.allocation_units a
ON p.partition_id = a.container_id
WHERE
p.index_id in(0,1) -- 0 heap table , 1 table with clustered index
AND p.rows is not null
AND a.type = 1 -- row-data only , not LOB
GROUP BY
s.[Name]
, t.[name]
ORDER BY
1
, 2
现在,您可以将结果集与可能存在或可能不存在的表列表进行比较。
答案 1 :(得分:0)
您可以尝试这样的事情:
DECLARE @SourceTables TABLE (tbl_name VARCHAR(100))
INSERT INTO @SourceTables VALUES('TABLE1'),('TABLE2'),('TABLE3');
WITH CTE
AS
(
SELECT o.name AS tbl_name,
i.[Rows] AS row_count
FROM sysindexes i
INNER JOIN sysobjects o
ON i.id = o.id
WHERE i.IndId < 2
AND xtype = 'U'
)
--Returns tables that don't exist
SELECT CASE
WHEN B.tbl_name IS NULL AND B.row_count > 0 --when there is no table and row count is greater than 0, then good
THEN 'Good'
ELSE 'Bad'
END AS Source_Check,
A.tbl_name
FROM @SourceTables A
LEFT JOIN CTE B
ON A.tbl_name = B.tbl_name
理论结果:
Source_Check tbl_name
------------ -------------------------
Good TABLE1
Good TABLE2
Bad TABLE3
答案 2 :(得分:0)
我假设您正在使用基于SSIS包的SQL Server。您可以使用OBJECT_ID简化一些事情尝试以下内容......
CREATE TABLE #OUTPUT(Source_Check VARCHAR(10), Source_Table VARCHAR(10))
IF OBJECT_ID('DBNAME.dbo.Table1') IS NOT NULL
BEGIN
INSERT INTO #OUTPUT VALUES ('GOOD', 'TABLE1')
END
ELSE
INSERT INTO #OUTPUT VALUES ('BAD', 'TABLE1')
END
IF OBJECT_ID('DBNAME.dbo.Table2') IS NOT NULL
BEGIN
INSERT INTO #OUTPUT VALUES ('GOOD', 'TABLE2')
END
ELSE
INSERT INTO #OUTPUT VALUES ('BAD', 'TABLE2')
END
IF OBJECT_ID('DBNAME.dbo.Table3') IS NOT NULL
BEGIN
INSERT INTO #OUTPUT VALUES ('GOOD', 'TABLE3')
END
ELSE
INSERT INTO #OUTPUT VALUES ('BAD', 'TABLE3')
END
SELECT * FROM #OUTPUT