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 和临时表 的相关文章

随机推荐

  • 对于包含主键和外键的迁移文件运行“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