zoukankan      html  css  js  c++  java
  • 快速定义临时表或表变量

    背景

      在编写存储过程时,难免会用到表变量或临时表,定义的字段类型一般都要求和源数据表一致或兼容。当字段数量少时,我们手工敲出来就OK了,但当字段比较多且来源于多张数据表时,就得费些时间了,且易出错,下面介绍一个小方法来解决这个问题。

    方案

      #1.大家都知道SELECT ... INTO #new_table FROM ... 语法。INTO后生成的新表#new_table中的字段类型会与SELECT字段列表中的字段类型一致或兼容。

      #2.从系统表中取出#new_table表的字段类型。

    示例

    USE tempdb
    GO
    
    --创建2个测试表
    IF OBJECT_ID('table1', 'U') IS NOT NULL
        DROP TABLE dbo.table1
    GO
    CREATE TABLE dbo.table1
    (
        id BIGINT,
        field1 INT,
        field2 XML,
        field3 DECIMAL(10,2)
    )
    GO
    IF OBJECT_ID('table2', 'U') IS NOT NULL DROP TABLE dbo.table2 GO CREATE TABLE dbo.table2 ( id BIGINT, field4 DATETIME, field5 NVARCHAR(MAX), field6 VARCHAR(8), field7 CHAR(9) ) GO --把SELECT产生的结果集插入到一个临时表 IF OBJECT_ID('tempdb..#tempA', 'U') IS NOT NULL DROP TABLE #tempA GO SELECT TOP(0) a.field1, a.field2, a.field3, b.field4, b.field5, b.field6, field7 = b.field7 + 'ab' INTO #tempA FROM dbo.table1 A INNER JOIN dbo.table2 B ON a.id = b.id --获取表结构 DECLARE @TemptableName NVARCHAR(50) SET @TemptableName = '#tempA' --临时表名称 SELECT TableName = a.name, FieldDefinition = b.name + ' ' + c.name + CASE WHEN c.name in ('binary', 'char', 'varbinary', 'varchar') THEN '(' + (CASE b.max_length WHEN -1 THEN 'max' ELSE LTRIM(b.max_length) END) + ')' WHEN c.name IN ('nchar' ,'nvarchar') THEN '(' + (CASE b.max_length WHEN -1 THEN 'max' ELSE LTRIM(b.max_length/2) END) + ')' WHEN c.name IN ('bigint', 'bit', 'datetime', 'float', 'image', 'int', 'money', 'ntext', 'real', 'smalldatetime', 'smallint', 'smallmoney', 'sysname', 'text', 'timestamp', 'tinyint', 'uniqueidentifier', 'xml', 'date', 'datetime2', 'datetimeoffset','geography', 'geometry', 'hierarchyid','time') THEN '' WHEN c.name IN('decimal', 'numeric') THEN '(' + LTRIM(b.[precision]) + ',' + LTRIM(b.scale) + ')' ELSE '' END + ',' FROM tempdb.sys.tables a INNER JOIN tempdb.sys.columns b ON a.object_id = b.object_id INNER JOIN sys.types c ON b.user_type_id = c.user_type_id WHERE a.name like @TemptableName + '%'


    --查询结果如下图
    表字段类型查询
    --把查询出的FieldDefinition列粘贴出来,得到最终结果 DECLARE @test TABLE ( field1 int, field2 xml, field3 decimal(10,2), field4 datetime, field5 nvarchar(max), field6 varchar(8), field7 char(11)  --注意,这儿长度变成了11 )

    小结

      #1. 像这种临时应用,建议INTO到临时表中,用完就不用管了。注意以#开头的临时表,实际的名称会是:#TableName+N个下划线+数字字母,所以按name查询时,我们用like。

      #2. 这种方法获取的字段类型准确性比较高,特殊情况下,可修改下获取表结构的SQL脚本。

      #3. 类似的小脚本,我一般是保存在SQL Prompt的Snippet Manager中,方便快速使用。

  • 相关阅读:
    BZOJ 4316: 小C的独立集 (仙人掌,树形DP)
    LOJ #2587. 「APIO2018」铁人两项 (圆方树,树形DP)
    BZOJ 5329: [Sdoi2018]战略游戏 (圆方树,树链的并)
    CF487E Tourists (圆方树,LCT)
    BZOJ 4873: [Shoi2017]寿司餐厅 最大权闭合图
    【转】python文件打开方式详解——a、a+、r+、w+区别
    【转】使用git将项目上传到github(最简单方法)
    整数型数组组合成字符串
    【转】浏览器中输入url后发生了什么
    去除列表中重复的元素
  • 原文地址:https://www.cnblogs.com/wwwwgou/p/3549656.html
Copyright © 2011-2022 走看看