T-SQL 动态 SQL 和临时表

2023-11-27

看起来通过 EXECUTE 字符串方法使用动态 SQL 创建的 #temptables 具有不同的作用域,并且不能由同一存储过程中的“固定”SQL 引用。 但是,我可以在后续动态 SQL 中引用由动态 SQL 语句创建的临时表,但除非 SQL 已修复,否则存储过程似乎不会将查询结果返回给调用客户端。

一个简单的 2 表场景: 我有2张桌子。我们将它们称为订单和项目。订单的主键为 OrderId,项目的主键为 ItemId。 Items.OrderId 是标识父订单的外键。一个订单可以有 1 到 n 个项目。

我希望能够向用户提供一个非常灵活的“查询生成器”类型界面,以允许用户选择他想要查看的项目。过滤条件可以基于“项目”表和/或“父订单”表中的字段。如果某个项目满足过滤条件,包括父订单上的条件(如果存在),则查询中应返回该项目以及父订单。

通常,我想大多数人会在 Item 表和父 Order 表之间构建一个联接。我想执行 2 个单独的查询。一个返回所有符合条件的商品,另一个返回所有不同的父订单。原因有两个,你可能同意也可能不同意。

第一个原因是我需要查询父订单表中的所有列,如果我执行单个查询将订单表连接到项目表,我将多次重复订单信息。由于每个订单通常有大量商品,我想避免这种情况,因为这会导致更多数据传输到胖客户端。相反,如上所述,我想在数据集中单独返回两个表,并使用其中的两个表来填充自定义订单和子项目客户端对象。 (我对 LINQ 或实体框架还不够了解。我手动构建我的对象)。我想返回两个表而不是一个表的第二个原因是因为我已经有另一个过程,该过程返回给定 OrderId 的所有项目以及父订单,并且我想使用相同的 2 表方法,以便我可以重用客户端代码来从返回的 2 个数据表中填充我的自定义订单和客户端对象。

我希望做的是这样的:

在客户端上构造一个动态 SQL 字符串,它将订单表连接到项目表,并按照在 Winform 胖客户端应用程序上创建的自定义过滤器指定的方式对每个表进行适当的过滤。客户端上的 SQL 构建看起来像这样:

TempSQL = "

    INSERT INTO #ItemsToQuery
       OrderId, ItemsId
    FROM
       Orders, Items 
    WHERE
       Orders.OrderID = Items.OrderId AND
       /* Some unpredictable Order filters go here */
      AND
       /* Some unpredictable Items filters go here */
    "

然后,我会调用一个存储过程,

CREATE PROCEDURE GetItemsAndOrders(@tempSql as text)
   Execute (@tempSQL) --to create the #ItemsToQuery table

SELECT * FROM Items WHERE Items.ItemId IN (SELECT ItemId FROM #ItemsToQuery)

SELECT * FROM Orders WHERE Orders.OrderId IN (SELECT DISTINCT OrderId FROM #ItemsToQuery)

这种方法的问题在于,#ItemsToQuery 表是由动态 SQL 创建的,因此无法从以下 2 个静态 SQL 访问,并且如果我将静态 SQL 更改为动态,则不会将任何结果传递回胖客户端。

我想到了 3 个左右,但我正在寻找一个更好的:

1)第一个SQL可以通过从客户端执行动态构造的SQL来执行。然后,结果可以作为表传递到上述存储过程的修改版本。我熟悉以 XML 形式传递表数据。如果我这样做,存储过程就可以使用静态 SQL 将数据插入到临时表中,因为它是由动态 SQL 创建的,所以可以毫无问题地进行查询。 (我还可以研究传递新的 Table 类型参数而不是 XML。)但是,我想避免将可能较大的列表传递给存储过程。

2)我可以执行客户端的所有查询。

第一个是这样的:

SELECT Items.* FROM Orders, Items WHERE Order.OrderId = Items.OrderId AND (dynamic filter)
SELECT Orders.* FROM Orders, Items WHERE Order.OrderId = Items.OrderId AND (dynamic filter)

这仍然使我能够重用客户端对象填充代码,因为订单和项目继续在两个不同的表中返回。

我有一种感觉,我可能有一些在存储过程中使用表数据类型的选项,但这对我来说也是新的,我会很感激在这个选项上进行一点点喂养。

如果您浏览了我写的这篇文章,我会感到惊讶,但如果是这样,我将不胜感激您对如何最好地实现这一目标的任何想法。


您首先需要创建表,然后它将在动态 SQL 中可用。

这有效:

CREATE TABLE #temp3 (id INT)
EXEC ('insert #temp3 values(1)')

SELECT *
FROM #temp3

这是行不通的:

EXEC (
        'create table #temp2 (id int)
         insert #temp2 values(1)'
        )

SELECT *
FROM #temp2

换句话说:

  1. 创建临时表
  2. 执行过程
  3. 从临时表中选择

这是完整的示例:

CREATE PROC prTest2 @var VARCHAR(100)
AS
EXEC (@var)
GO

CREATE TABLE #temp (id INT)

EXEC prTest2 'insert #temp values(1)'

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

T-SQL 动态 SQL 和临时表 的相关文章

  • SQL:使用 1 个查询更新一行并返回列值

    我需要更新表中的一行 并从中获取列值 我可以这样做 UPDATE Items SET Clicks Clicks 1 WHERE Id Id SELECT Name FROM Items WHERE Id Id 这会生成 2 个对该表的计划
  • 所有排序规则下包含相同长度整数的字符串的数字排序顺序

    是否可以安全地假设 SQL Server 中的所有排序规则都会对包含相同长度整数的字符串给出 预期 即数字 排序顺序 例如 假设 text仅包含非负整数 0 9 以下代码片段是否可以确保该值不会溢出int范围 或者可能有一些排序规则 tex
  • 向上或向下舍入到最接近的 20

    正如问题所示 我需要向上或向下舍入到最接近的 20 除了 0 14 的数字外 所有数字都必须舍入到 20 因为不允许零值 该表不必用新值更新 目前我只能四舍五入到最接近的 100 如下所示 CASE WHEN ROUND number 2
  • 如何将字符串解析为日期?

    如何在 T SQL 中将字符串转换为日期 我的测试用例是字符串 24 04 2012 CONVERT datetime 24 04 2012 104 应该做到这一点 请参阅此处了解更多信息 CAST 和 CONVERT Transact S
  • 如何改进使用两列的 case 语句

    我有一个名为 购买 的表 其中有一个 状态 列 其中 1 已授权 2 已完成 还有一些其他值 我还有一个 Retailer 表 其中有一列 RetailerProcessType 其中 1 是一步 2 是两步 我有以下疑问 CASE pur
  • 聚合 SQL 函数以仅获取每组中的第一个

    我有 2 个表 一个帐户表和一个用户表 每个帐户可以有多个用户 我有一个场景 我想对这两个表执行单个查询 联接 但我想要所有帐户数据 Account 并且只需要first用户数据集 特别是他们的名字 我不想对聚合组执行 最小 或 最大 操作
  • 使用动态层次结构 SQL Server

    我在 SQL Server 中有以下数据集 层次结构表 Report Immediate Parent Child1 Parent1 Child2 Parent1 Child3 Parent2 Parent1 Grandparent1 Pa
  • 对一列求和,然后减去另一列的总和

    我有一个包含以下字段的表 EmpID Code Amount TransDate CM CMDate 我想要访问数据网格的是SUM一切Amount具有相同的Code and SUM the CM具有相同的Code as the Amount
  • ASP.Net SQL 连接字符串配置

    我正在尝试学习 ASP Net 并遵循 mvc 教程 http www asp net mvc tutorials mvc music store part 4 http www asp net mvc tutorials mvc musi
  • 无法让链接服务器在 Sql Azure 中工作

    我们正在使用 Azure 的试用版 我们正在尝试从我们内部的 SQL Server 2012 执行跨服务器查询 我们似乎已经将我们本地的 2012 年与 Azure 联系起来了 当我进入Server Object gt Linked Ser
  • SQL Server 2005 的未知优化?

    我在听 SO 播客 他们提到了 SQL Server 2008 的 Optimize For Unknown 他们还提到 SQL Server 2005 有类似的东西 有人知道这是什么吗 正如 Mladen Prajdic 提到的 OPTI
  • 文件夹或 SQL Server 作为二进制存储图像的更好方法是什么?

    我正在计划为客户开发一个照片库应用程序 我正在 asp net 3 5 中开发该应用程序 并希望开发它 以便我可以使用各种前端跨多个平台重复使用该应用程序 基本上 我想知道将图像作为二进制文件存储在数据库中与简单地将文件存储在应用程序文件夹
  • 从t-sql中找出sql server服务已经运行了多长时间

    我想是否可以从 sql server 内部计算出 sql server 已经运行了多长时间 想要将其与 DMV 之一结合使用以获取未使用的索引 但每次 sql server 加载时计数器都会重新设置 所以我想知道它们会有多大用处 SELEC
  • 如何将查询的输出存储到临时表中并在新查询中使用该表?

    我有一个 MySQL 查询 它使用 3 个表和 2 个内部联接 然后 我必须从此查询输出中找到一组的最大值 将它们结合起来超出了我的范围 我可以通过将第一个复杂查询的输出存储到某种临时表中 给它一个名称 然后在新查询中使用该表来分解问题吗
  • 使用 SqlBulkCopy 插入 GUID

    我正在尝试使用以下命令进行批量插入SqlBulkCopy来自由 SQL Server 管理导入导出向导创建的平面文件的类 这些文件以逗号分隔 文件中的一行可能如下所示 DCAD82A9 32EC 4351 BEDC 2F8291B40AB3
  • PHP SQLSRV:sqlsrv_query() 是否可以正确地准备 select 语句?

    TL DR Does sqlsrv query 做同样的工作select陈述比sqlsrv prepare and sqlsrv execute 关于准备好的陈述 做什么 我怎样才能做一个安全的select陈述 一点历史 我是 PHP 开发
  • 使用参数的 SQL Server 查询比使用常量字符串的查询花费的时间更长

    我在使用 MS SQL Server 2008 时遇到一个问题 当我使用硬编码字符串作为参数执行查询时 查询运行得很快 但是当我使用字符串参数时 查询需要更长的时间 常量字符串查询需要1秒 而其他则需要11秒 以下是代码 常量字符串 1秒
  • SQL Server 更改数据捕获 - 捕获进行更改的用户

    关于SQL Server 更改数据捕获 https msdn microsoft com en us library bb933994 v sql 120 aspx 你能追踪到User谁对行 列数据进行了更改 或者是否有办法扩展 CDC 以
  • 如何在SQL中搜索日期?

    我有一个我想要的事件管理系统 如果某个活动注册了 5 天 2009 年 1 月 21 日至 2009 年 1 月 26 日 那么如果另一个人想要在 2009 年 1 月 22 日至 24 日期间注册活动 则不允许注册 我想使用 SQL 查询
  • 无法登录 SQL Server + SQL Server 身份验证 + 错误:18456

    我已经在 localhost sql2008 服务器上创建了登录帐户 例如 User123 映射到数据库 默认 SQL Server 上的身份验证模式设置为两者 Windows 和 SQL 但登录 SQL Server 失败并显示以下消息

随机推荐

  • 对于包含主键和外键的迁移文件运行“php artisan migrate”时出现语法错误或访问冲突错误

    您好 我正在尝试在数据库中创建 2 个名为 品牌 和 产品 的表 我为 品牌 创建了名为 create brand 的迁移文件 其中包含 public function up Schema create brand function tab
  • 如何将点击传递给顶部小部件下方的小部件?

    我正在尝试实现一个非常简单的版本卡片分页器组件Flutter 中的 单卡 这是我创建的基本演示的示例 class CardComponent extends StatelessWidget override Widget build Bui
  • 如何让 DataGridView 组合框一键显示其下拉列表?

    当我将 EditOnEnter 设置为 true 后 DataGridViewComboBoxCell如果我不单击组合框的向下箭头部分 仍然需要单击两次才能打开 有人知道如何解决这个问题吗 我有我自己的DataGridView我使用的类 因
  • Opera 中的 SVG 使用具有缩放功能的 CSS 背景图像

    我正在尝试在背景图像上使用 SVG 例如 logo position absolute width 300px height 300px background image url img logo svg background size 2
  • 如何获取前 10 个最高值的变量的列名?

    如果我有一个包含 600 列 变量 和 10 行的 data frame sum clus 这些行没有 NA 并且都是数值 我如何创建 5 个新变量来为我提供该行中前 5 个变量的列名称 For eg max lt apply sum cl
  • 如何通过分配新的集合来更新多对多中的集合?

    在实体框架核心2 0中 我之间有多对多关系Post and Category 绑定类是PostCategory 当用户更新一个Post 整体Post对象 及其PostCategorycollection 正在发送到服务器 这里我想重新分配新
  • 在某些浏览器中首次未请求 clientaccesspolicy.xml

    我在 Silverlight 4 中遇到跨域 Web 服务调用的奇怪问题 启动后 应用程序会立即从下载的同一主机上调用 Web 服务 但端口不同 例如 应用程序驻留在http www mydomain com 80网络服务位于http ww
  • 没有找到类“androidx.core.app.CoreComponentFactory”

    我不知道该如何处理以下错误 我在网上搜索但没有找到任何内容 java lang ClassNotFoundException Didn t find class androidx core app CoreComponentFactory
  • React Native - 初始属性 Android

    我正在 React Native 下工作 我正在寻找通过 Java 将初始 props 传递给 JS 这可以在 Objective C 中使用如下的initialProperties 轻松完成 RCTRootView rootView RC
  • 导出 MySQL 中的表,其中的列具有换行符

    我对 SQL 非常缺乏经验 所以应该有一个简单的解决方案来解决我的问题 我正在将一个表选择到逗号分隔的文件中 并且 TEXT 类型的列具有换行符 因此当我尝试将 csv 导入 Excel 时 它会在换行符后面为每段文本创建单独的行 这是我的
  • 带有精美图标的闪亮下拉输入(selectizeInput)

    我想包括字体真棒Shiny 项目中的图标selectizeInput 我该怎么办 这是一个函数 selectInputWithIcons 就可以了 library shiny library fontawesome library html
  • C# MVC 4 ControllerName 属性

    我正在努力为我的 MVC 4 控制器提供友好的名称 我想做一些类似的事情 ActionName My Friendly Name 风格 但针对整个控制器 我找不到有关此类属性的任何信息 那么我该怎么做呢 另外 我需要添加一个新的 MapRo
  • shinydashboard 不能与 uiOutput 一起使用

    我在 server R 中设置了 UI 以进行更多控制 但是在 server R 中定义时 shinyDashboard 不起作用 我将此方法与 navBarPage 一起使用没有问题 这段代码有效 library shiny librar
  • 实体框架实体 SQL 与 linq to 实体

    实体sql的目的是什么 我的意思是 如果你有实体的linq 为什么你需要在字符串中编写查询 是否有任何性能原因或其他原因 LINQ to Entities 不允许您访问数据库的每个功能 能够 深入 数据库有时对于高级查询是必要的 要么首先完
  • 如何在sql server 2008中使用插入后触发器

    我正在 sql server 上工作 我想将记录插入到特定的表中 例如 a 在将记录插入表中之后 该表现在包含两列 id 身份字段 和名称 nvarchar max a 触发器应该触发并在表 b 中插入标识字段值 我为此目的使用插入触发器
  • Javascript-更改文本区域中某些文本的字体颜色

    有没有JS函数可以改变textarea中某些文本的颜色 例如 blar blar blar blar blar 包括 将为蓝色 其他单词将显示为空白 换句话说 我需要的只是一个可以改变 中所有文本颜色的函数 我做了一些研究 似乎大多数人都说
  • 不带 Spring Boot 的 Spring Boot 执行器

    我一直在开发 Spring Spring MVC 应用程序 并且希望添加性能指标 我遇到过 Spring Boot Actuator 它看起来是一个很好的解决方案 但是我的应用程序不是 Spring Boot 应用程序 我的应用程序在传统容
  • 我应该取消订阅 Cold Observable 吗?

    我知道这是一个很好的做法取消订阅从可观察到预防内存泄漏 但如果是冷可观测我也应该取消订阅吗 例如 返回的一个Http get 你不需要这样做 HTTP 可观察对象在操作完成后立即调用完成 从源代码来看sources我理解了unsubscri
  • scala import 是递归的吗?

    With import mypack 我还需要吗 import mypack box writer import mypack box reader and import mypack box parser stringparser 搜索
  • T-SQL 动态 SQL 和临时表

    看起来通过 EXECUTE 字符串方法使用动态 SQL 创建的 temptables 具有不同的作用域 并且不能由同一存储过程中的 固定 SQL 引用 但是 我可以在后续动态 SQL 中引用由动态 SQL 语句创建的临时表 但除非 SQL