繁体   English   中英

T-SQL变量

[英]T-SQL Variables

如果要引用同一批中多个查询的行集,可以使用哪种类型的对象(在T-SQL中)?

我要强调的是同一批。

非常感谢

创建一个临时表变量并将其插入。

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
INSERT INTO 
    @TempCustomer 
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

对我来说还不够清楚,但是您可以使用批量插入或批量更新来处理multiplus结果。

对于INSERT,您可以执行SELECT来精确返回要插入到另一个表中的字段,例如...

INSERT INTO TableA (ID, Name, Phone) SELECT CustomerID, CustomerName, CustomerPhone FROM TableB

要进行更新,请意识到您的TableA带有“客户”,可以使用TableB信息进行更新,然后您可以...

UPDATE TableA SET TableA.Phone=TableB.Phone FROM TableB WHERE TableA.CustomerID=TableB.CustomerID

这个问题对我来说还不是很清楚,但是一种使用方式是在“会话”表中实现数据:

SessionId - UNIQUEIDENTIFIER is one option
Col1
Col2
...
Coln

UNIQUEIDENTITIER是最简单的选项,但不是最快的(大键)。 否则,可以使用SEQUENCE (SQL2012 +)。

  1. 生成会话标识符
  2. 需要处理数据的查询会收到此标识符并使​​用它过滤数据。
  3. 该解决方案允许“同时”多个作者和读者
  4. 可以在系统停机期间(如果可能)完成表删除(截断)操作,以最大程度地减少删除影响(删除是一项繁重的操作,并且会锁定整个表

使用INSERT .. SELECT:获得数据生成INSERT .. SELECT:

INSERT INTO SessionTable
(SessionId, Col1, Col2, ... , Coln)
SELECT @SessionId, ....
FROM <various sources>

缺点:

  1. 该表已实现,具有SELECT权限的每个人都可以访问。 如果处理了敏感数据,则必须处理安全性( DENY )。

  2. 必须显式截断/删除表(临时表和表变量将自动删除)

您可能要使用Global Temp表,因为该表的范围超出了当前会话的范围,但是警告它仅在有会话访问它时可用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM