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. springmvc @PathVariable("b") double b 丢失精度问题

    Spring MVC从3.0开始支持REST,而主要就是通过@PathVariable来处理请求参数和路径的映射.由于考虑到SEO的缘故,很多人喜欢把新闻的名称作为路径中的一部分去处理,这时候中文的名 ...

  2. C语言基础(1)-基本语法及注意事项

    1. include 头文件包含 #include <stdio.h>这个是hello world程序的第一句话 # 代表预编译指令 #include的意思就是头文件包含,使用C语言库函数 ...

  3. oracle中时间处理

    --查看当前日期.时间SQL> select sysdate from dual; SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') ...

  4. bzoj2330 糖果

    Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...

  5. IIS 输入地址 目录浏览

  6. NOIp2014 解题报告

    有史以来第一届面向社会征题的NOIp结束了.最开始以为面向社会征题会很难,但是这是我参加的最水的一次NOIp了. 由于停了两月的课,所以现在正在补文化科目就没时间打代码了.所以所有的题目就均不给出代码 ...

  7. python file

    >>> help(open) Help on built-in function open in module __builtin__: open(...) open(name[, ...

  8. json死循环问题

    20.JSON死循环问题: 向前台发送的数据: 出现此类问题主要是由于在所传数据中有包含关系,比如ElementGroup中有Element,Element中又有ElementGroup,此时就会出现 ...

  9. springMVC配置Json

    步骤1:将json包引入工程中,分别是:jackson-annotations-2.7.0.jar,jackson-core-2.7.0.jar,jackson-databind-2.7.0.jar ...

  10. js中的事件委托或是事件代理详解

    起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...