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语句拿出来,当然是可以执行的,不过有些业务就是要动态处理,摊手中……

Solution

这时候该我们的临时表登场了。先看示例:

DECLARE @sql_command NVARCHAR(MAX);
DECLARE @parameter_list NVARCHAR(MAX);
IF OBJECT_ID('tempdb..#last_names') IS NOT NULL
BEGIN
DROP TABLE #last_names;
END; CREATE TABLE #last_names ( last_name NVARCHAR(50) ); INSERT INTO #last_names
( last_name )
SELECT 'Thomas'
SELECT @sql_command = '
INSERT INTO #last_names
(last_name)
SELECT ''Smith'';
SELECT DISTINCT
FirstName
FROM Person.Person
WHERE LastName IN (SELECT last_name FROM #last_names); '
EXEC sp_executesql @sql_command;
SELECT *
FROM #last_names; IF OBJECT_ID('tempdb..#last_names') IS NOT NULL
BEGIN
DROP TABLE #last_names;
END;

从运行结果判定可以得出结论:临时表不仅可以在动态SQL中访问,还可以进行写操作。当然另外还有一种用永久表做临时存储的,这里就不提供示例了。

最后送一个小彩蛋,假设业务场景,我们传入参数是BusinessEntityId的序列,以逗号分隔。然后动态SQL执行,获取想要的person。这时候应该怎么做呢?

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

  1. Part 17 Temporary tables in SQL Server

    Temporary tables in SQL Server

  2. SQL Server中Table字典数据的查询SQL示例代码

    SQL Server中Table字典数据的查询SQL示例代码 前言 在数据库系统原理与设计(第3版)教科书中这样写道: 数据库包含4类数据: 1.用户数据 2.元数据 3.索引 4.应用元数据 其中, ...

  3. sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) Cannot add a NOT NULL column with default value NULL [SQL: u'ALTER TABLE address_scopes ADD COLUMN ip_version INTEGER NOT NULL']

    root@hett-virtual-machine:~# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neu ...

  4. OpenStack安装keyston 错误BError: (pymysql.err.InternalError) (1071, u‘Specified key was too long; max key length is 767 bytes‘) [SQL: u‘\nCREATE TABLE migrate_ver

    折腾了两天的错误,BError: (pymysql.err.InternalError) (1071, u‘Specified key was too long; max key length is ...

  5. SQL脚本存在TABLE ACCESS FULL行为

    对于SQL的执行计划,一般尽量避免TABLE ACCESS FULL的出现,那怎样去定位,系统里面哪些SQL脚本存在TABLE ACCESS FULL行为,对于9i及以后版本,使用以下语句即可 sel ...

  6. Pyspark中遇到的 java.io.IOException: Not a file 和 pyspark.sql.utils.AnalysisException: 'Table or view not found

    最近执行pyspark时,直接读取hive里面的数据,经常遇到几个问题: 1.  java.io.IOException: Not a file —— 然而事实上文件是存在的,是 hdfs 的默认路径 ...

  7. Temporary Tables and the TableType Property [AX 2012]

    Temporary Tables and the TableType Property [AX 2012] 1 out of 1 rated this helpful - Rate this topi ...

  8. Internal Temporary Tables

    8.4.4 How MySQL Uses Internal Temporary Tables 这是MySQL手册中的一节,尝试补充了一些解释.用的版本是MySQL5.6.15社区版 In some c ...

  9. HOW MYSQL USES INTERNAL TEMPORARY TABLES

    HOW MYSQL USES INTERNAL TEMPORARY TABLES Table of Contents [hide] 1)UNION queries 2)Some views 3)SQL ...

随机推荐

  1. Gravatar注册

    今天在学习falsk时需要用到头像扩展,需要使用gravatar到网上查了查好像没有被墙,就试着用qq邮箱注册了一个账号,结果等了好长时间也没有等到激活邮箱,就百度了一下发现了一个技巧,原来这封邮件被 ...

  2. DP专辑

    今天练了一波DP.时间紧迫我就只贴代码了. 20141120 fzu2129 http://acm.fzu.edu.cn/problem.php?pid=2129 不同的子序列个数 //#pragma ...

  3. [SQL] SQL学习笔记之基础操作

    1 SQL介绍 SQL 是用于访问和处理数据库的标准的计算机语言.关于SQL的具体介绍,我们通过回答如下三个问题来进行. SQL 是什么? SQL,指结构化查询语言,全称是 Structured Qu ...

  4. UVALive 4329 Ping pong

                                      Ping pong Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Fo ...

  5. Linux C 字符串输出函数 puts()、fputs()、printf() 详解

    一.puts() 函数详解 puts()函数用来向 标准输出设备 (屏幕)写字符串并换行,调用格式为: puts(s); 其中s为字符串变量(字符串数组名或字符串指针). puts()函数的作用与语 ...

  6. 介绍一个非常好用的跨平台C++开源框架:openFrameworks

    介绍一个非常好用的跨平台C++开源框架:openFrameworks 简介 首先需要说明的一点是: openFrameworks 设计的初衷不是为计算机专业人士准备的, 而是为艺术专业人士准备的, 就 ...

  7. 学习 CSS 样式

    1.CSS浮动  :  http://www.cnblogs.com/zhongxinWang/archive/2013/03/27/2984764.html (1)一个重要结论:           ...

  8. java4

    1:如何制作帮助文档(了解) (1)写一个类 (2)加入文档注释 (3)通过javadoc工具生成即可 javadoc -d 目录 -author -version ArrayTool.java 2: ...

  9. Delete,Update与LEFT Join

    UPDATE:UPDATE A SET ApproverID=NULL FROM [SH_MaterialApplyBuyBill] A LEFT JOIN [SH_MaterialApplyBuyB ...

  10. Java、JVM模型

    程序计数器:记录当前线程的执行位置(便于CPU切换线程的时候执行) 虚拟机栈:Java方法,方法从调用到执行完成对应一个栈帧从虚拟机栈入栈到出栈的过程. 本地方法区:Native方法(C++) 方法区 ...