T-SQL Recipes之 Table Variables and Temporary Tables and CTE

Problem

许多时候, 我们想要Table Variables在动态SQL中执行,但现实是很骨感的。比如这个示例:

DECLARE @sql_command NVARCHAR(MAX);
DECLARE @parameter_list NVARCHAR(MAX);
DECLARE @last_names TABLE ( last_name NVARCHAR(50) );
SELECT  @sql_command = ‘
SELECT DISTINCT
FirstName
FROM Person.Person
WHERE LastName IN (SELECT last_name FROM @last_names)‘
EXEC sp_executesql @sql_command;

有人看到这里,也许第一直觉就会问,为什么不在动态SQL中申明@last_names,其实然并卵。

这条路走不通,那我们换条路吧,比如Type Table:

CREATE TYPE last_name_table AS TABLE
(last_name NVARCHAR(50));
GO
--DROP TYPE last_name_table
DECLARE @sql_command NVARCHAR(MAX);
DECLARE @parameter_list NVARCHAR(MAX);
DECLARE @first_name_calling_sql NVARCHAR(50) = ‘Edward‘;
DECLARE @last_names AS last_name_table;

SELECT  @sql_command = ‘
INSERT  INTO @last_names
        ( last_name
        )
        SELECT  LastName
        FROM    Person.Person
        WHERE   FirstName = @first_name_calling_sql;

SELECT DISTINCT
FirstName
FROM Person.Person
WHERE LastName IN (SELECT last_name FROM @last_names)
‘
SELECT  @parameter_list = ‘@first_name_calling_sql NVARCHAR(50),
@last_names last_name_table READONLY‘
EXEC sp_executesql @sql_command, @parameter_list, @first_name_calling_sql,@last_names;

如果把Insert语句拿出来,当然是可以执行的,不过有些业务就是要动态处理,摊手中……

时间: 2025-01-13 15:10:12

T-SQL Recipes之 Table Variables and Temporary Tables and CTE的相关文章

SQL Fundamentals:Substitution Variables(替代变量)

Substitution Variables(替代变量) 在WHERE子句中,通过使用替代变量来代替精确的值,就可以用不同的值运行同一个查询. Use substitution variables to: Temporarily store values with single-ampersand(&) and double-ampersand(&&) substitution Use substitution variables to supplement the followi

获得sql server的table的表结构 -- 转到word中

SQL语句: select syscolumns.name,systypes.name,syscolumns.length from syscolumns join sysobjects on syscolumns.id=sysobjects.id and sysobjects.xtype='U' join systypes on systypes.xtype=syscolumns.xtype where sysobjects.name='master_location' order by sy

Internal Temporary Tables

8.4.4 How MySQL Uses Internal Temporary Tables 这是MySQL手册中的一节,尝试补充了一些解释.用的版本是MySQL5.6.15社区版 In some cases, the server creates internal temporary tables while processing queries. Such a table can be held in memory and processed by the MEMORY storage en

Temporary Tables临时表

1简介 ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables.这些临时表用来保存一个会话SESSION的数据, 或者保存在一个事务中需要的数据.当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空, 但是临时表的结构以及元数据还存储在用户的数据字典中. 临时表只在oracle8i以及以上产品中支持. 2详细介绍 Oracle临时表分为 会话级临时表和事务级临时表. 会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用

【SQL篇章--CREATE TABLE】

[SQL篇章][SQL语句梳理 :--基于MySQL5.6][已梳理:CREATE TABLE][会坚持完善] SQL : 1. Data Definition Statements: 1.3 CREATE TABLE 格式:3种建表语句 1.简单SQL表明结构: CREATE TABLE t7(id INT ,NAME VARCHAR(20), PRIMARY KEY(`id`)) ENGINE=INNODB; 格式: CREATE [TEMPORARY] TABLE [IF NOT EXIS

Access建表SQL语句Create Table设置自动增长列的关键字AUTOINCREMENT使用方法

SQL AUTO INCREMENT 字段 uto-increment 会在新记录插入表中时生成一个唯一的数字. AUTO INCREMENT 字段 我们通常希望在每次插入新记录时,自动地创建主键字段的值. 我们可以在表中创建一个 auto-increment 字段. 用于 MySQL 的语法 下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键: CREATE TABLE Persons ( P_Id int

SQL Server 关于 Table 字典数据的查询SQL

分享一个关于查询SQL Server Table 结构的SQL 语句. T-SQL 如下: SELECT (case when a.colorder=1 then d.name else '' end) 表名,a.colorder 字段序号,a.name 字段名,(case when a.colorder=1 then isnull(f.value,'') else '' end) 表说明, (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')

将sql Server 的table的列 ,由非自增长改为自增长

转载:http://www.thinksaas.cn/topics/0/423/423869.html Demo /**************** 准备环境********************/ --判断是否存在test表 if object_id(N'test',N'U') is not null drop table test --创建test表 create table test ( id int not null, name varchar(20) not null ) --插入临

SQL xml转table

创建虚拟表@Tmp DECLARE @Tmp TABLE(ID INT,Resulr XML) --插入数据 INSERT INTO @Tmp (ID,Resulr) VALUES (1,'<root><row><ID>1</ID><score>80</score></row><row><ID>2</ID><score>85</score></row>