2017-12-20 6 views
0

SQLステートメントを使用してレコード数を含む一時テーブルを作成しています。これは、4つのフィールド、記述子、および3つの整数カウントを挿入します。最後のフィールドCountBYODEntityStagingTableは、実際には私がsp_addlinkedserverを使ってリンクした別のデータベースです。場合によっては、そのテーブルが公開されていないと存在しないことがあります。SQL - テーブルにデータを取り込みます。

私はそれをカウントしようとする前にテーブルが存在するかどうかをチェックするために、私の下のステートメントにどのようなロジックを追加できますか?

INSERT INTO #TempTable (
    EntityName, 
    CountMainTable, 
    CountEntityView, 
    CountEntityStagingTable, 
    CountBYODEntityStagingTable 
) VALUES 
('CustTransEntity', (SELECT count(*) FROM CustTrans), (SELECT count(*) FROM CustTransEntity), (SELECT count(*) FROM CustTransEntityStaging), (SELECT count(*) FROM DEVBYOD.dbo.CustTransEntityStaging)), 
('VendTransEntity', (SELECT count(*) FROM VendTrans), (SELECT count(*) FROM VendTransEntity), (SELECT count(*) FROM VendTransEntityStaging), (SELECT count(*) FROM DEVBYOD.dbo.VendTransEntityStaging)), 
('TaxTransEntity', (SELECT count(*) FROM TaxTrans), (SELECT count(*) FROM TaxTransEntity), (SELECT count(*) FROM TaxTransEntityStaging), (SELECT count(*) FROM DEVBYOD.dbo.TaxTransEntityStaging)) 

多くのおかげで、あなたはこのような何かを行うことができ

アンドリュー

+1

-transact-sql)を使用して、テーブルが存在するかどうかを問い合わせます。テーブルのリストが動いているターゲットの場合は、[dynamic sql](https://docs.microsoft.com/en-us/sql/odbc/reference/dynamic-sql)と組み合わせてクエリを構築します。 –

+0

3つのテーブルはすべて存在しないか、または1つだけ存在しますか? – plaidDK

答えて

0

を助けることができるかどうか。 LinkedSserverの種類はわかりませんが、これはSQLデータベース上で動作します。

SQL変数でYOURDATABASENAMEを変更することを忘れないでください。

DECLARE @CustTransNo int = (select count(*) from CUSTRANS) 
DECLARE @VendTransNo int =(select count(*) from VendTrans) 
DECLARE @TaxTransNo int =(select count(*) from TaxTrans) 

DECLARE @CustTransEntity int = (select count(*) from CustTransEntity) 
DECLARE @VendTransEntity int =(select count(*) from VendTransEntity) 
DECLARE @TaxTransEntity int =(select count(*) from TaxTransEntity) 


DECLARE @CustTransEntityStaging int = (select count(*) from CustTransEntityStaging) 
DECLARE @VendTransEntityStaging int =(select count(*) from VendTransEntityStaging) 
DECLARE @TaxTransEntityStaging int =(select count(*) from TaxTransEntityStaging) 


----Check if they exists 


--CustTrans 
DECLARE @CustTransEntityStagingBYOD int 
DECLARE @LinkedServerNameCust nvarchar(50) = 'MYLINKEDSERVERNAME' 
DECLARE @SQLCustTrans NVARCHAR(MAX) = '' 
DECLARE @TableExistsCustTrans BIT; 

SET @SQLCustTrans = 'SELECT @TableExists = CASE WHEN TableExists = 0 THEN 0 ELSE 1 END 
      FROM OPENQUERY(' + QUOTENAME(@LinkedServerNameCust) 
      + ', ''SELECT TableExists = COUNT(*) 
        FROM YOURDATABASENAME.INFORMATION_SCHEMA.TABLES 
        WHERE TABLE_NAME = ''''CustTransEntityStaging'''''');'; 

EXECUTE sp_executesql @SQLCustTrans, N'@TableExists BIT OUTPUT', @TableExistsCustTrans OUT; 

IF(@TableExistsCustTrans = 1) 
BEGIN 
SET @CustTransEntityStagingBYOD = (select count(*) from DEVBYOD.dbo.CustTransEntityStaging) 
END 
ELSE 
BEGIN 
SET @CustTransEntityStagingBYOD = 0 
END 

--VendTrans 
DECLARE @VendTransEntityStagingBYOD int 
DECLARE @LinkedServerNameVend nvarchar(50) = 'MYLINKEDSERVERNAME' 
DECLARE @SQLVendTrans NVARCHAR(MAX) = '' 
DECLARE @TableExistsVendTrans BIT; 

SET @SQLVendTrans = 'SELECT @TableExists = CASE WHEN TableExists = 0 THEN 0 ELSE 1 END 
      FROM OPENQUERY(' + QUOTENAME(@LinkedServerNameVend) 
      + ', ''SELECT TableExists = COUNT(*) 
        FROM YOURDATABASENAME.INFORMATION_SCHEMA.TABLES 
        WHERE TABLE_NAME = ''''VendTransEntityStaging'''''');'; 

EXECUTE sp_executesql @SQLVendTrans, N'@TableExists BIT OUTPUT', @TableExistsVendTrans OUT; 

IF(@TableExistsVendTrans = 1) 
BEGIN 
SET @VendTransEntityStagingBYOD = (select count(*) from DEVBYOD.dbo.VendTransEntityStaging) 
END 
ELSE 
BEGIN 
SET @VendTransEntityStagingBYOD = 0 
END 

--TaxTrans 
DECLARE @TaxTransEntityStagingBYOD int 
DECLARE @LinkedServerNameTax nvarchar(50) = 'MYLINKEDSERVERNAME' 
DECLARE @SQLTaxTrans NVARCHAR(MAX) = '' 
DECLARE @TableExistsTaxTrans BIT; 

SET @SQLTaxTrans = 'SELECT @TableExists = CASE WHEN TableExists = 0 THEN 0 ELSE 1 END 
      FROM OPENQUERY(' + QUOTENAME(@LinkedServerNameTax) 
      + ', ''SELECT TableExists = COUNT(*) 
        FROM YOURDATABASENAME.INFORMATION_SCHEMA.TABLES 
        WHERE TABLE_NAME = ''''TaxTransEntityStaging'''''');'; 

EXECUTE sp_executesql @SQLTaxTrans, N'@TableExists BIT OUTPUT', @TableExistsTaxTrans OUT; 

IF(@TableExistsTaxTrans = 1) 
BEGIN 
SET @TaxTransEntityStagingBYOD = (select count(*) from DEVBYOD.dbo.TaxTransEntityStaging) 
END 
ELSE 
BEGIN 
SET @TaxTransEntityStagingBYOD = 0 
END 

INSERT INTO #TempTable (EntityName, CountMainTable, CountEntityView, CountEntityStagingTable, CountBYODEntityStagingTable) 

VALUES 
('CustTransEntity', @CustTransNo, @CustTransEntity, @CustTransEntityStaging, @CustTransEntityStagingBYOD), 
('VendTransEntity',@VendTransNo, @VendTransEntity, @VendTransEntityStaging, @VendTransEntityStagingBYOD), 
('TaxTransEntity', @TaxTransNo, @TaxTransEntity, @TaxTransEntityStaging, @TaxTransEntityStagingBYOD) 
0

私は最も簡単な方法は、(作成したテーブル)が存在するすべてのテーブルのマスターテーブルを維持することだと思います。そして、挿入する間だけマスターテーブルをチェックしてください。その場合は、何のエラーもありません。

INSERT INTO #TempTable (EntityName, CountMainTable, CountEntityView, CountEntityStagingTable, CountBYODEntityStagingTable) VALUES 
('CustTransEntity', (SELECT count(*) FROM CustTrans), (SELECT count(*) FROM CustTransEntity), (SELECT count(*) FROM CustTransEntityStaging), (SELECT CASE WHEN CustTransEntityStaging = (SELECT * from TableMaster) THEN (select CAST(COUNT(*) as varchar) from DEVBYOD.dbo.CustTransEntityStaging) ELSE 'No such Table' END)) 
0

これは簡単です!あなたは[情報スキーマ](https://docs.microsoft.com/en-us/sql/relational-databases/system-information-schema-views/system-information-schema-viewsを使用することができます

DECLARE @CustTransEntityStagingCount INT = 0 , 
     @VendTransEntityStagingCount INT = 0, 
     @TaxTransEntityStagingCount INT = 0 



IF EXISTS (
     SELECT 1 
     FROM DEVBYOD.sys.Tables -- [LinkedServerName].[DatabaseName].sys.Tables 
     WHERE [Name] = 'CustTransEntityStaging' 
    ) 
    SELECT @CustTransEntityStagingCount = COUNT(*) 
    FROM DEVBYOD.dbo.CustTransEntityStaging 


    IF EXISTS (
     SELECT 1 
     FROM DEVBYOD.sys.Tables -- [LinkedServerName].[DatabaseName].sys.Tables 
     WHERE [Name] = 'VendTransEntityStaging' 
    ) 
    SELECT @VendTransEntityStagingCount = COUNT(*) 
    FROM DEVBYOD.dbo.VendTransEntityStaging 


    IF EXISTS (
     SELECT 1 
     FROM DEVBYOD.sys.Tables -- [LinkedServerName].[DatabaseName].sys.Tables 
     WHERE [Name] = 'VendTransEntityStaging' 
    ) 
    SELECT @TaxTransEntityStagingCount = COUNT(*) 
    FROM DEVBYOD.dbo.TaxTransEntityStaging 


INSERT INTO #TempTable 
    (
    EntityName, 
    CountMainTable, 
    CountEntityView, 
    CountEntityStagingTable, 
    CountBYODEntityStagingTable 
) 
VALUES 
    (
    'CustTransEntity', 
    (
     SELECT COUNT(*) 
     FROM CustTrans 
    ), 
    (
     SELECT COUNT(*) 
     FROM CustTransEntity 
    ), 
    (
     SELECT COUNT(*) 
     FROM CustTransEntityStaging 
    ), 
    (
     @CustTransEntityStagingCount 
    ) 
), 
(
    'VendTransEntity', 
    (
     SELECT COUNT(*) 
     FROM VendTrans 
    ), 
    (
     SELECT COUNT(*) 
     FROM VendTransEntity 
    ), 
    (
     SELECT COUNT(*) 
     FROM VendTransEntityStaging 
    ), 
    (
     @VendTransEntityStagingCount 
    ) 
), 
(
    'TaxTransEntity', 
    (
     SELECT COUNT(*) 
     FROM TaxTrans 
    ), 
    (
     SELECT COUNT(*) 
     FROM TaxTransEntity 
    ), 
    (
     SELECT COUNT(*) 
     FROM TaxTransEntityStaging 
    ), 
    (
     @TaxTransEntityStagingCount 
    ) 
) 
関連する問題