检查表是否存在以及表是否为null

时间:2015-04-21 18:09:58

标签: sql function ssis exists

我在SSIS中构建一个包,该包首先从另一个服务器获取源数据并加载到我的服务器中。从那里我有另一个包来操作这个源数据并加载一个新表。

我想阻止这种操纵'如果我的消息来源失败,请运行包裹。包。我可以说出来,但不能语法化......

如果MyTABLE存在并且从MyTABLE计数(*)> 0然后' GOOD'别的'坏'如果有什么事情发生变坏,我将会遇到一个不能运行其余软件包的约束。如果这是实现这一目标的愚蠢方式,那么请告诉我实现这一目标的更简单方法。

最终目标是列出一个“好”的列表。或者'坏'并且表名作为下一列,所以如果有任何失败,我可以收到一封我的查询电子邮件,它会很快告诉我什么是坏的,什么是好的。

Source_Check          Source_Table
  GOOD                   TABLE1
  BAD                    TABLE2
  GOOD                   TABLE3

等.....

我的问题是我从一个不存在的表中尝试计算(*)时遇到错误...不确定如何克服这个问题:(

可能有更简单的方法来解决这个问题,我只是一个新手。可以将我的搜索权限用于从谷歌获取任何结果。

3 个答案:

答案 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