【发布时间】:2020-09-14 21:42:40
【问题描述】:
我有一个如下的存储过程,我想将其结果导出到一个表中。
DECLARE
@ReportYearCmd VARCHAR(1000),
@CosCountCmd VARCHAR(1000),
@FranchiseCountCmd AS VARCHAR(1000),
@ProductCountCmd AS VARCHAR(1000);
WITH Validations AS (
SELECT TOP 1 * FROM [Handshake] WHERE [Status] = 'Loaded' AND [Update Time] = ( SELECT MAX( [Update Time] ) FROM Handshake )
)
UPDATE Validations
SET
@ReportYearCmd = CASE WHEN Report_Year_Count = 0 THEN NULL
ELSE 'SELECT DISTINCT [Report Year] AS [Report Year] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Report Year] WHERE [Report Year].[Report Year] = [Fact].[Report Year] );'
END,
@CosCountCmd = CASE WHEN COS_Count = 0 THEN NULL
ELSE 'SELECT DISTINCT [Country Code] AS [COS - Country Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [COS] WHERE [COS].[Country Code] = [Fact].[Country Code] );'
END,
@FranchiseCountCmd = CASE WHEN Franchise_Count = 0 THEN NULL
ELSE 'SELECT DISTINCT [Style Code] AS [Franchise - Style Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Franchise] WHERE [Franchise].[Style Code] = [Fact].[Style Code] );'
END,
@ProductCountCmd = CASE WHEN Product_Count = 0 THEN NULL
ELSE 'SELECT DISTINCT [Style Code] AS [Product - Style Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Product] WHERE [Product].[Style Code] = [Fact].[Style Code] );'
END,
[Status] = CASE
WHEN ( Report_Year_Count = 0 AND COS_Count = 0 AND Franchise_Count = 0 AND Product_Count = 0 ) THEN 'Good'
ELSE 'Rejects'
END
FROM [Validations]
OUTER APPLY (
SELECT
ISNULL( ( SELECT COUNT(*) FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Report Year] WHERE [Report Year].[Report Year] = [Fact].[Report Year] ) ), 0 ) AS [Report_Year_Count],
ISNULL( ( SELECT COUNT(*) FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [COS] WHERE [COS].[Country Code] = [Fact].[Country Code] ) ), 0 ) AS [COS_Count],
ISNULL( ( SELECT COUNT(*) FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Franchise] WHERE [Franchise].[Style Code] = [Fact].[Style Code] ) ), 0 ) AS [Franchise_Count],
ISNULL( ( SELECT COUNT(*) FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Product] WHERE [Product].[Style Code] = [Fact].[Style Code] ) ), 0 ) AS [Product_Count]
) AS [ValidationCounts];
-- Return validation sql statements --
SELECT
@ReportYearCmd AS ReportYearCmd,
@CosCountCmd AS CosCountCmd,
@FranchiseCountCmd AS FranchiseCountCmd,
@ProductCountCmd AS ProductCountCmd;
-- Insert actual SQL statament results into Rejects Table --
IF(OBJECT_ID('tempdb..#TEMP') IS NOT NULL)
BEGIN DROP TABLE #TEMP END
SELECT
ReportYearCmd, CosCountCmd, FranchiseCountCmd, ProductCountCmd
INTO #TEMP
FROM (
SELECT
@ReportYearCmd AS ReportYearCmd,
@CosCountCmd AS CosCountCmd,
@FranchiseCountCmd AS FranchiseCountCmd,
@ProductCountCmd AS ProductCountCmd
) AS [RejectsTable]
这仅从第一个 select 语句返回验证语句,但我没有看到 RejectTable 显示来自这些 SQL 语句的实际拒绝...
目前,当我执行此 SP 时,我会得到如下信息:
ReportYearCmd CosCountCmd FranchiseCountCmd ProductCountCmd
NULL SELECT DISTINCT [Country Code] AS [COS - Country Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [COS] WHERE [COS].[Country Code] = [Fact].[Country Code] ) NULL SELECT DISTINCT [Style Code] AS [Product - Style Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Product] WHERE [Product].[Style Code] = [Fact].[Style Code] )
我想返回实际结果,即如果 Cmd 不是 NULL,如上例,返回 CosCountCmd 和 ProductCountCmd 数据:
COS - Country Code Product - Style Code
reject1 Rejectxy
reject2 Reject1234
NULL Reject567
我遵循了一些示例 here,但它们似乎都不适合我...
【问题讨论】:
-
临时表在 SP 结束时超出范围...所以在您返回时它会消失。
-
@DaleK 哦...但是我有 GO 之后...应该有所作为吗?那我应该把它放在哪里
-
GO 是用于分隔语句的客户端命令。什么也不做。
-
您要么必须创建一个 real 表来返回结果,要么在调用上下文中创建临时表,因为它可用于任何被调用的 SP。
-
在调用您的 SP 之前创建它。
标签: sql-server