【问题标题】:SQL Server, Problem creating temp table in TSQLSQL Server,在 SQL 中创建临时表时出现问题
【发布时间】:2011-08-31 13:12:28
【问题描述】:

嗨,当我执行以下 TSQL 时,我收到以下错误消息。但是SQL语法没有错吗?

create table #tb ([t1] tinyint, [t2] varchar(50))
insert into #tb values
    (1, 'a'), 
    (2, 'b')

消息 102,级别 15,状态 1,行 3 ',' 附近的语法不正确。

SQL 查询窗口中没有其他内容。运行 SQL Server 2005。

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql temp-tables


    【解决方案1】:

    正如 jmoreno 所提到的,VALUES (), () 语法支持 SQL Server 2008+,但您将其标记为 SQL Server 2005。

    用途:

    CREATE TABLE #tb ([t1] tinyint, [t2] varchar(50))
    
    INSERT INTO #tb 
    SELECT 1, 'a'
    UNION ALL
    SELECT 2, 'b'
    

    也可以在单个查询中使用SELECT ... INTO clause 执行此操作,但临时表不能已经存在:

    SELECT *
      INTO #tb
      FROM (SELECT CAST(1 AS TINYINT) AS t1, 
                   CAST('a' AS VARCHAR(50)) AS t2
            UNION ALL
            SELECT 2, 'b') x
    

    【讨论】:

    • OMG 小马,因为“x”,我不得不投票赞成你一年半的答案。我认为这一定是 FROM 语句末尾的拼写错误,但事实并非如此,它确实对我有很大帮助!
    【解决方案2】:

    试试这个:

    create table #tb ([t1] tinyint, [t2] varchar(50));
    insert into #tb ([t1], [t2])
    values(1, 'a'), (2, 'b')
    

    您需要指定要插入的列。

    //编辑

    对不起,SQL 2005 语法如下。它几乎没有那么优雅。

    CREATE TABLE #tb ([t1] TINYINT, [t2] VARCHAR(50));
    INSERT INTO #tb
    SELECT 1, 'a'
    UNION ALL
    SELECT 2, 'b'
    

    【讨论】:

      【解决方案3】:

      您说您使用的是 SQL 2005,但 VALUES (), () 语法直到 2008 年才实现。

      【讨论】:

      • 哦好吧..那我怎么重写呢?
      • 多个insert语句,或者一个select和UNION ALL。
      【解决方案4】:

      看起来您正在尝试插入两行,因此您需要先插入第一行,然后再插入第二行,而不是试图将它们全部挤成一行:

      CREATE TABLE #tb ([t1] TINYINT, [t2] VARCHAR(50));
      INSERT INTO #tb([t1],[t2]) VALUES (1, 'a'); --row 1
      INSERT INTO #tb([t1],[t2]) VALUES (2, 'b'); --row 2
      
      --see if it worked
      SELECT [t1], [t2] 
      FROM #tb
      
      --clean up the temp table when you're done
      DROP TABLE #tb
      

      【讨论】:

        【解决方案5】:

        选择 t.field1, t.field2 INTO #myTempTable

        FROM myDB.myOwner.myTable

        在哪里...

        按 t.field1、t.field2 排序;

        -- 如果您希望表是 GLOBAL,请使用 ##myTempTable 作为名称。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-10
          • 2011-06-12
          • 2011-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-19
          • 2020-09-24
          相关资源
          最近更新 更多