2017-12-20 9 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

당신은 [정보 스키마 (https://docs.microsoft.com/en-us/sql/relational-databases/system-information-schema-views/system-information-schema-views를 사용할 수 있습니다 -transact-sql)를 사용하여 테이블이 존재하면 쿼리합니다. 테이블 목록이 이동 대상인 경우 [동적 SQL] (https://docs.microsoft.com/en-us/sql/odbc/reference/dynamic-sql)과 결합하여 쿼리를 작성하십시오. –

+0

세 개의 테이블이 모두 존재하지 않거나 하나만 존재할 수 있습니까? – 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

이것은 간단합니다!

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 
    ) 
)