我有一个带有输出一行的 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/