将存储过程结果导出到表中

2023-12-07

我有以下存储过程,可以根据某些条件生成 SQL 语句。

我希望 SQL 语句也将实际结果返回到表中。

CREATE TABLE [dbo].[Rejects](
    [Report Year] [varchar](100) NULL,
    [COS - Country Code] [varchar](100) NULL,
    [Franchise - Style Code] [varchar](100) NULL,
    [Product - Style Code] [varchar](100) NULL
) ON [PRIMARY]

我怎么能这么做呢?

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;

基本上,就在这部分之后:

-- Return validation sql statements --

SELECT
    @ReportYearCmd AS ReportYearCmd,
    @CosCountCmd AS CosCountCmd,
    @FranchiseCountCmd AS FranchiseCountCmd,
    @ProductCountCmd AS ProductCountCmd;

目前,当我执行这个 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 数据:

Report Year COS - Country Code   Franchise - Style Code   Product - Style Code 
NULL        reject1              NULL                     Rejectxy
NULL        reject2              NULL                     Reject1234
NULL        NULL                 NULL                     Reject567

尝试这个:

/* Execute the dynamic SQL to return their resultsets if cmd variable IS NOT NULL */

IF @ReportYearCmd IS NOT NULL
    EXEC ( @ReportYearCmd );

IF @CosCountCmd IS NOT NULL
    EXEC ( @CosCountCmd );

IF @FranchiseCountCmd IS NOT NULL
    EXEC ( @FranchiseCountCmd );

IF @ProductCountCmd IS NOT NULL
    EXEC ( @ProductCountCmd );

Note:这可能会返回四个不同的结果集,而不是经过透视的结果。

EDIT:

为每个拒绝类别返回一个结果集。

这大约是您无需做大量额外工作即可获得的最接近结果:

DECLARE @Rejects TABLE ( 
    [Report Year] VARCHAR(50),
    [COS - Country Code] VARCHAR(50),
    [Product - Style Code] VARCHAR(50),
    [Franchise - Style Code] VARCHAR(50)
);

IF @ReportYearCmd IS NOT NULL
    INSERT INTO @Rejects ( [Report Year] ) EXEC ( @ReportYearCmd );
    
IF @CosCountCmd IS NOT NULL
    INSERT INTO @Rejects ( [COS - Country Code] ) EXEC ( @CosCountCmd );
    
IF @FranchiseCountCmd IS NOT NULL
    INSERT INTO @Rejects ( [Franchise - Style Code] ) EXEC ( @FranchiseCountCmd );
    
IF @ProductCountCmd IS NOT NULL
    INSERT INTO @Rejects ( [Product - Style Code] ) EXEC ( @ProductCountCmd );

-- Return resultset.
SELECT * FROM @Rejects;

返回类似以下内容:

+-------------+--------------------+------------------------+----------------------+
| Report Year | COS - Country Code | Franchise - Style Code | Product - Style Code |
+-------------+--------------------+------------------------+----------------------+
| NULL        | reject1            | NULL                   | NULL                 |
| NULL        | reject2            | NULL                   | NULL                 |
| NULL        | NULL               | NULL                   | Rejectxy             |
| NULL        | NULL               | NULL                   | Reject1234           |
| NULL        | NULL               | NULL                   | Reject567            |
+-------------+--------------------+------------------------+----------------------+

您的调用应用程序在处理结果时需要处理 NULL 值,因为没有简单的方法可以“汇总”NULL 列/行来减少您期望的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将存储过程结果导出到表中 的相关文章

随机推荐

  • 插入表情符号不适用于 spring-boot 和 MariaDB

    我想在 mariaDB 数据库中插入像 这样的表情符号 但我总是收到 sql 错误 这是堆栈跟踪 12 01 2018 16 01 44 466 Executor Migration 1 WARN o h e jdbc spi SqlExc
  • 为什么 strcpy 没有分段错误? [复制]

    这个问题在这里已经有答案了 可能的重复 未定义 未指定和实现定义的行为 这应该是段错误 为什么不呢 include
  • MeteorJS Mobile 构建:rooturl 始终为 10.0.2.2:3000,而不是构建脚本期间指定的真实服务器

    几天来我在meteorjs和移动构建方面遇到了一些问题 3 个不同的应用程序均出现此问题 我使用 np 脚本和此类脚本构建应用程序 usr bin env bash if z npm package config mongourl then
  • Spring Boot JPA 使用 Hibernate 在 TABLE 中插入大写名称

    我有一个表实体映射为 Entity public class ItemsToRegister implements Serializable Id Column name ID ITEM TO REGISTER GeneratedValue
  • 如何在php中找到这个数组的值?

    我有一个数组 如何获取该数组的值 Array 0 gt Array 0 gt raj 1 gt 1234 2 gt gov 1 gt Array 0 gt some 1 gt 1234 2 gt prv 2 gt Array 0 gt la
  • 为什么切片不起作用?

    我是 Javascript 新手 我正在尝试编写一个 chrome 扩展 对于扩展 如果用户输入一个字符串 我希望前两个字符被切掉 目前 我有 if text charAt 0 text slice 0 2 chrome tabs crea
  • JSON.NET 和 nHibernate 集合的延迟加载

    有人将 JSON NET 与 nHibernate 一起使用吗 我注意到当我尝试加载带有子集合的类时出现错误 我遇到了同样的问题 所以我尝试使用 Liedman的代码 但是GetSerializableMembers 从未被要求提供代理参考
  • 延迟但不禁用 iPhone 自动锁定

    我目前有一个非常简单的应用程序 唯一的交互就是摇动 iPhone 然而 由于 iPhone 没有收到任何触摸事件 屏幕最终会变暗并自动锁定 我想知道是否有办法重置震动时自动锁定超时 我知道要完全禁用自动锁定 我会这样做 UIApplicat
  • 如何使用正则表达式查找特定匹配并将它们放入字符串数组中?

    我有一个 HTML 文件 我正在尝试从中提取数据 我使用的正则表达式是
  • 删除 arrayList 中的元素后出现 InvalidOperationException [重复]

    这个问题在这里已经有答案了 您好 我正在尝试从 arrayList 中删除所有可被 2 整除的数字 问题是 删除一个元素后 我得到一个 InvalidOperationException private ArrayList RemoveDi
  • 如何从文本文件中读取数百万行并快速插入表中

    我已经经历了快速向 SQL Server 插入 200 万行链接并发现我可以通过使用批量插入来做到这一点 所以我试图创建数据表 代码如下 但由于这是一个巨大的文件 超过 300K 行 我得到一个OutOfMemoryEexception在我
  • Y86汇编全局变量

    我正在努力让全局变量为我的 Y86 作业正常工作 不幸的是 我们提供的唯一示例是 IA 32 组件 我过去几个小时一直在寻找 但没有结果 这是我知道的非常基础的知识 但我在 Y86 完全是新手 我 声明 我的变量如下 align 4 x l
  • MySQL-自动递减值

    假设我有一个表 像这样 id 是自动递增的 id col1 col2 1 msg msg 2 lol lol2 3 xxx x 现在 我想删除第 2 行 我得到这样的结果 id col1 col2 1 msg msg 3 xxx x 问题是
  • 如何将某些内容注入到表单中

    从play 2 4 0开始 我们可以使用DI框架 我正在尝试在我的应用程序中使用 DI 我将 jpa 查找器从模型类上的静态方法移至注入控制器的服务层中的方法 我的主要问题是我有一些带有验证方法的表单 并且在我的验证方法中我使用了一些查找器
  • 让 ReSharper 尊重您对代码顺序的偏好

    与我的另一个问题相关 布局 C 类的最佳方式是什么 ReSharper 中有没有办法定义您希望成员的顺序 以便 ReSharper 维护它 From 这个答案 检查下类型成员布局 in Options 在下面C 节点 这并不简单 但可以更改
  • 如何使用 R 创建分组条形图[重复]

    这个问题在这里已经有答案了 我正在尝试使用 R 创建分组条形图 我尝试使用以下代码来创建一个简单的条形图 x c 99 9 104 67 86 53 83 29 127 31 179 86 74 80 100 150 68 18 81 47
  • Delphi 中重载记录的隐式转换作为 const 数组中的参数

    作为 Delphi 7 转换的一部分 我们摆脱了 ShortString 我想让它尽可能轻松 所以我们认为我们可以将 ShortString 更改为一些以相同方式起作用的记录 这是它的声明方式 还有更多内容 但这是基本结构 概述了问题 TS
  • 用ANTLR解析Java代码“需求概念”

    我正在尝试使用 ANTLR 进行程序编译 我使用 Java 编程语言作为目标 问题的核心是开发 Intent Regornizer 来纠正错误并改进源代码 如果源代码不符合 语法 在 ANTLR 的教程和书籍上 我看到如何编译一个简单的代码
  • 订单状态完成时更改购买特定产品的用户角色

    因此 我帮助某人启动了一个网站 当有人购买特定产品时 他们想要折扣产品 我找到了一个解决方案并实施了它 它在网站启动时发挥了作用 并且不再改变客户在购买产品时的角色 我试图获得 Woothemes 的支持 但他们不支持定制 并希望他们购买
  • 将存储过程结果导出到表中

    我有以下存储过程 可以根据某些条件生成 SQL 语句 我希望 SQL 语句也将实际结果返回到表中 CREATE TABLE dbo Rejects Report Year varchar 100 NULL COS Country Code