2012-05-16 64 views
4

下面是一個例子號碼列表轉換成(臨時)表;如何使用SQL(SQL Server)的

我有一個數字(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 

問題是數字列表是動態的。它可以有任何沒有值。所以我需要一個適當的系統方式將這些值轉換爲臨時錶行。

+0

如果你有更多的價值,添加更多的聯盟? – Andomar

+0

我在尋找中獲得的SQL – Bala

+2

UDF東西比N多UNION更好地分裂一個字符串,並返回一個表 - http://stackoverflow.com/a/2657/1016183 – Paddy

回答

5

我用了很多的溶液...

供應你的號碼爲VARCHAR(MAX)逗號delimeted字符串列表,然後用那人都寫上線的衆多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存儲過程的模板,使用表值參數。

+0

我使用iBatis的 – Bala

+0

SELECT * FROM <迭代屬性= 「IDS」 開放= 「(」 接近= 「)」 一起= 「UNION」> SELECT $ IDS [] $ AS id_val X \t LEFT JOIN table1 t1 \t \t ON id_val = t1.id_val \t WHERE t1.id_val IS NULL – Bala

+0

我確定這個函數可以工作。但我很猶豫使用〜100行函數來創建臨時表。有沒有其他更簡單的方法? – Bala

0

您可以使用下面查詢選擇100的隨機值從1到9

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 
0

我使用一個通用的帶編號的行。

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