c# - select查询值临时存放在哪里,如何分别获取每个值

标签 c# sql-server-2008

我有一个带有输出一行的 SELECT 语句的存储过程。它是这样的:

CREATE PROCEDURE [dbo].[CreateCustomer]
...

INSERT INTO Customers values(, , , ,)
SELECT CustomerID, FirstName, LastNam.....
INSERT Roles values(, , , .....

这将从 Customers 表中选择新存储的值。第二个插入使用新的 CustomerID 将新行插入到 Roles 表中。

有没有办法从上面的选择语句中获取 customerID 而无需再次查询 CustomerID?

我试过声明一个变量并像这样:

SELECT takenCustomerID = CustomerID, FirstName, LastNam....(rest of query statement)

但是我必须声明所有的变量并且这样做:

SELECT takenCustomerID, takenFirstName, takenLastNa... = CustomerID, FirstName, LastNam... (rest of query statement)

但是,我认为这很糟糕,因为它会在服务器端浪费大量内存。

那么,有没有一种无需在 select 语句中声明所有变量即可立即获取单个值的简单方法,例如我可以调用 TEMP("customerID") 并获取的内置 TEMP 类变量值(value)?

另外,一个存储过程中是否可以有多个SELECT语句?我们如何从我们想要的选择语句中获取选择值?

出于好奇,我问得更多,因为我已经知道获取值的方法。我只想知道有没有更优雅的方式。

最佳答案

访问插入的值

很简单。使用 OUTPUT 子句返回您刚刚创建的值。

DECLARE @Customers TABLE (
   CustomerID uniqueidentifier,
   FirstName varchar(100),
   LastName varchar(100)
);

INSERT dbo.Customers 
OUTPUT Inserted.*
INTO @Customers
SELECT newsequentialid(), @FirstName, @LastName, ...;
-- now you have all the values of the new row in the `@Customers` table variable.

然后你可以这样做:

INSERT dbo.Roles
SELECT
   CustomerID,
   @OtherValue,
   @AnotherValue,
   AnyotherColumnFrom@Customers
FROM @Customers;

如果您不再需要插入的 Customer 行中的值,您甚至可以取消表变量,直接将 OUTPUT 输出到 Roles 表中,假设进入该表的所有值都来自变量。

OUTPUT 子句使用特殊元表Inserted 提供对插入值的访问。但是,您也可以将变量和表达式与常量一起使用。

使用此方法的好处是您可以一次处理许多插入的行。如果您只插入一行,之后您只需要 CustomerID,并且您需要多次使用它,那么请改为这样做:

DECLARE @CustomerID uniqueidentifier = newsequentialid();
INSERT @Customer VALUES (@CustomerID, ...);
INSERT @Roles VALUES (..., @CustomerID ...);

通过预先创建 GUID,您不需要从表中取回它。顺便说一下,newsequentialid() 可能优于 newid() 如果它是聚集索引(这可能是真的),因为您将避免页面拆分 newid 会导致。

返回多个结果集

这总是可能的。无论您使用什么方式进行查询,都将有一个方法将您的数据访问对象推进到下一个记录集。如果您使用的是 DataReader,请查看 NextResult 方法。在经典 ADO 中,记录集有一个 NextRecordset 方法。

关于c# - select查询值临时存放在哪里,如何分别获取每个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11716337/

相关文章:

c# - 连接字符串中的数据源设置

javascript - Sitecore - 字段未检测为已修改。如何强制显示保存提示?

c# - EF 一对一关系改变实体与另一个实体(替代)

sql - 需要帮助从 SQL 查询中创建一个函数

sql - 如何根据重复项对表列进行排名?

sql - 如何将xml的嵌套层次结构转换为sql表

sql - 如何根据 SQL 查询的结果运行子查询

c# - 自定义 "using" block

c# - Docker:将文件写入物理或共享路径,使用docker和netcore3.1

c# - 使用具有相同结构的两个不同表