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

  • 如何更新外键

    我有 2 张桌子 第一个表的设计如下 Table 1 id Doc line sheet pk Autonumber DocNo text lineNo text Sheet No text 字段组合 DocNo lineNo Sheet
  • 仅当表中尚不存在记录时插入记录

    我想知道是否有办法仅在表尚未包含该记录时才将记录插入表中 是否有一个查询可以执行此操作 或者我需要一个存储过程 你没有说 SQL Server 是什么版本 如果 SQL Server 2008 你可以使用MERGE http technet
  • 无法在单用户模式下启动sql server

    我正在尝试恢复我的本地 sql server sa 密码 我读到应该将其置于单用户模式 我就这样做了 我添加了 m 到启动参数 我没有运行 sql 代理 我重新启动了 Sql Server 当我尝试时 sqlmd S sqlexpress
  • ColdFusion cfscript 查询 LIKE 语句中是否存在通配符“%”?

    是否可以在 ColdFusion cfscript 查询中的 SQL LIKE 语句中使用通配符 一个不起作用的例子 local q new Query local q setDatasource variables dsn local q
  • 检索 SQL Server 中的日期; CURRENT_TIMESTAMP 与 GetDate()

    使用 SQL Server 哪一种是用于日期检索的最快或最佳实践方法 之间有区别吗CURRENT TIMESTAMP and GetDate CURRENT TIMESTAMP是标准的 ANSI SQL 因此理论上 如果您需要移动数据库 它
  • 关于选择数据类型

    如果在表的某一列中我希望值为 是 否 或 可选 那么我需要使用什么数据类型 BIT 占用 1 个字节 但在 SQL Server 中最多可以将 8 个 BIT 字段合并为一个 BYTE 存储两个值之一 1 表示 true 和 0 表示 fa
  • 当有匹配时,使用 MERGE 后如何获取标识值?

    假设我有一个带有身份字段的表 如果记录尚不存在 我想在其中插入一条记录 在下面的示例中 我检查存储在 Field1 中的值是否已存在于表中 如果没有 我插入一条新记录 表的定义 MyTable MyTableId int Identity
  • 区分大小写的连接 SQL

    我在这里有点停滞不前 我有一个简单的左外连接到一个返回 ID 的表 我的代码是 Select distinct TenantID Name Name2 TenantNumber Cashname From Tenants LEFT OUTE
  • sql server 具有不同时区的不同数据库。如何获取所有数据库的getdatetime

    我有 4 个数据库 每个数据库位于不同的时区 我如何获得所有这些的日期和时间GetDateTime 通常我们得到服务器时间 但我需要数据库的日期和时间 如果您使用的是 SQL 2008 或更高版本 您可以查看 系统日期时间偏移 http m
  • 如何在 rowguid 列中输入值?

    谁能告诉我在表的 rowguid 列中插入值的正确方法 我正在使用 sql server management studio use the NEWID https msdn microsoft com en us library ms19
  • 如果 ID 存在则更新记录,否则插入值

    如果记录存在 我正在尝试更新值 否则将值插入数据库 然而 这是行不通的 我写了下面的代码 String sqlCheck Select from UAP dbo UAP EMPLOYEE where EMP EMPLOYEE ID empI
  • 为什么主键顺序很重要?

    我最近在 EntityFramework 项目中设置了一个类 它将其几个成员指定为组合键 但是 当需要从中创建数据库时 它给出了错误 无法确定类型 NNNNN 的复合主键排序 使用 ColumnAttribute 或 HasKey 方法指定
  • 在sql server中使用case语句更新多列

    我想使用 case 语句更新表 查询是这样的 select case columnname when name1 then begin update table set pay1 pay1 100 pay2 pay2 20 pay3 pa
  • “SQLNCLI”提供程序未在本地计算机上注册,sql server 2012

    致力于将应用程序从我的开发箱部署到客户端 在客户端上运行 exe 时 出现错误 SQLNCLI10 提供程序未在本地计算机上注册 我正在 SQL Server 2012 中进行开发 我尝试在目标计算机上安装 sqlncli msi 但没有成
  • 具有三个表的递归 CTE

    我正在使用 SQL Server 2008 R2 SP1 我想通过 沿着树向上走 来递归地找到某个组织单位的第一个非空经理 我有一张包含组织单位 ORG 的表 一张包含每个组织的父级的表 ORG 中的单位 我们将该表称为 ORG PAREN
  • 从使用 (WHERE) 条件选择的行中获取上一行和下一行

    例如我有这样的说法 my name is Joseph and my father s name is Brian 该语句按单词拆分 如下表 ID word 1 my 2 name 3 is 4 Joseph 5 and 6 my
  • MYSQL:带有 if 语句的过程

    我正在尝试制定一个例程 首先检查用户密码 如果正确 它将从不同的表返回一些值或连续更改一些值 如果不进行在 PHP 中处理的两个查询 这是否可能 首先要求输入密码 检查密码是否正确 然后允许用户更改名称 下面是使用电子邮件和密码获取用户中的
  • 如何更新 SQL 中游标获取的列

    在进一步讨论之前 是的 我知道与基于集合的操作相比 游标的性能很差 在这种特殊情况下 我在包含 100 条左右记录的临时表上运行游标 并且该临时表始终相当小 因此性能不如灵活性那么重要 我的困难是我无法找到如何更新游标获取的列的示例 以前
  • 将标识列添加到 SQL Server 2008 中的视图

    这是我的观点 Create View MyView as Select col1 col2 col3 From Table1 UnionAll Select col1 col2 col3 From Table2 我需要添加一个名为的新列Id
  • 如何查询 SQL Server TEXT 列中包含 XML(不是 xml 列类型)的值

    我有表文档 DOCUMENTS DOCUMENTID int USERID int CONTENT text 我在 SQL Server 数据库中将以下 XML 存储在名为 CONTENT 的 TEXT 列中

随机推荐

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