【问题标题】:How to convert list of numbers into (temp) table using SQL (SQL Server)如何使用 SQL(SQL Server)将数字列表转换为(临时)表
【发布时间】:2012-05-16 08:15:55
【问题描述】:

这是一个例子;

我有数字列表 (1,5,8,36),我希望这些值作为 (temp) 表行。一种方法如下

select 1 as n into ##temp
union
select 5  as n 
union 
select 8 as n
union 
select 36 as n

问题是号码列表是动态的。它可以有任何值。所以我需要一种适当的系统方法将这些值转换为临时表行。

【问题讨论】:

  • 如果你有更多的值,添加更多的联合?
  • 我正在寻找比 SQL 中的 N 个 UNION 更好的东西
  • UDF 拆分字符串并返回表格 - stackoverflow.com/a/2657/1016183
  • 这些数字的来源是什么?您的应用程序能否改为传递 TVP?
  • @aF。 - The problem is number list is dynamic . it can have any no of values.

标签: sql sql-server sql-server-2008 temp-tables


【解决方案1】:

您可以使用以下查询从 1 到 9 中选择 100 个随机值

Declare @Index Int = 1
Declare @Result Table (Col Int)
While @Index <= 100 Begin
    Insert Into @Result (Col)
    Select FLOOR( RAND() * 10)

    Set @Index = @Index + 1 
End

Select * From @Result

【讨论】:

    【解决方案2】:

    我经常使用的解决方案...

    VARCHAR(MAX) 逗号分隔字符串的形式提供您的数字列表,然后使用人们在线编写的众多dbo.fn_split() 函数之一。

    许多在线示例之一...SQL-User-Defined-Function-to-Parse-a-Delimited-Str

    这些函数接受一个字符串作为参数,并返回一个表格。

    然后你可以做...

    INSERT INTO @temp SELECT * FROM dbo.split(@myList)
    
    SELECT
      *
    FROM
      myTable
    INNER JOIN
      dbo.split(@myList) AS list
        ON list.id = myTable.id
    


    另一种方法是查看表值参数。这些允许您将整个表作为参数传递给存储过程。如何取决于您使用的框架。您使用的是 .NET、Java、Ruby 等,您是如何与数据库通信的?

    一旦我们了解有关您的应用程序代码的更多详细信息,我们就可以向您展示客户端代码和 SQL 存储过程模板,以便使用表值参数。

    【讨论】:

    • SELECT * FROM SELECT $ids[]$ AS id_val x LEFT JOIN table1 t1 ON id_val = t1.id_val WHERE t1.id_val 为空
    • 我确定这个功能会起作用。但我很犹豫是否使用 ~100 行函数来创建临时表。还有其他更简单的方法吗?
    • @Dexter - 互联网上有很多拆分功能,还有很多在 Stack Overflow 上。只需在它们中搜索您喜欢的,和/或直到您理解它们并可以根据您的需要对其进行修改。
    【解决方案3】:

    我将它用于一组通用的编号行。

    SELECT DISTINCT ORDINAL_POSITION AS NUMBER_VAL 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE ORDINAL_POSITION BETWEEN 1 AND 36
    ORDER BY ORDINAL_POSITION
    

    【讨论】:

      【解决方案4】:
          create temporary table NS AS (
          SELECT a+b+c+d+e+f+g+h 
          FROM       (SELECT 0 as a UNION SELECT 1) 
          CROSS JOIN (SELECT 0 as b UNION SELECT 2) 
          CROSS JOIN (SELECT 0 as c UNION SELECT 4)
          CROSS JOIN (SELECT 0 as d UNION SELECT 8)
          CROSS JOIN (SELECT 0 as e UNION SELECT 16)
          CROSS JOIN (SELECT 0 as f UNION SELECT 32)
          CROSS JOIN (SELECT 0 as g UNION SELECT 64)
          CROSS JOIN (SELECT 0 as h UNION SELECT 128)
          WHERE a+b+c+d+e+f+g+h BETWEEN 1 AND 200
          ORDER BY 1
      )
      

      【讨论】:

      • 您好,请考虑添加解释,说明为什么这个工作/应该使用,而不仅仅是一个查询。
      猜你喜欢
      • 1970-01-01
      • 2012-04-01
      • 2020-01-21
      • 2020-11-18
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多