5

这是一个例子;

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

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

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

4

4 回答 4

6

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

将您的数字列表作为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 存储过程模板,以使用表值参数。

于 2012-05-16T08:33:18.990 回答
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
于 2012-05-21T22:59:46.760 回答
0

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

SELECT DISTINCT ORDINAL_POSITION AS NUMBER_VAL 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE ORDINAL_POSITION BETWEEN 1 AND 36
ORDER BY ORDINAL_POSITION
于 2015-10-30T17:41:43.597 回答
0
    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
)
于 2019-02-21T22:10:03.867 回答