2010-10-08 80 views
0

我想將來自.net解決方案的多個變量轉換爲整數。 類似這樣的: 我使用IN關鍵字來選擇多個關鍵字,因爲我不知道客戶選擇了多少個變量,我將它們放入nvarchar變量中。在sql中建立多個整數值

例子:

StatusID選擇:30,40,50

'30,40,50' 其作爲SQL nvarchar的參數到SQL Server

過去了,我想將它們轉換爲整數和有像這樣的: IN(cast(30,40,50 as int)) 這樣我得到一個錯誤。

有人可以幫助我如何設置適當的SQL語法。 謝謝,Laziale

回答

0

最好是在客戶端上構建sql,然後將其發送到SQL,因爲在SQL Server端不可能做到這一點。

你可以這樣來做:

string parameters = "30, 40, 50"; 
string sqlFormat = "SELECT * FROM MY_TABLE WHERE FIELD IN({0})"; 
string sql = String.Format(sqlFormat, parameters); 
myReader = command.ExecuteReader(sql); 

UPDATE

對於那些認爲這開啓了SQL注入,號碼列表是由應用程序和用戶創建的朋友只從列表中選擇項目。所以這不對用戶和可能的SQL注入開放。

+0

壞主意。它對sql注入是不安全的。 – Andrey 2010-10-08 17:16:04

+0

editted,安德烈擊敗了我的評論:) – Twelfth 2010-10-08 17:21:44

+0

爲什麼!?參數是由應用程序構造的,你的意思是應用程序將SQL注入自身嗎? – Aliostad 2010-10-08 17:26:04

0
SELECT * 
FROM YourTable 
WHERE StatusId IN(CAST('30' AS int),CAST('40' AS int),CAST('50' AS int)) 
+1

這很好,但我不知道他們會在網站上選擇多少個參數。有沒有辦法在存儲過程中添加參數或者不是真的嗎? – Laziale 2010-10-08 19:04:48

0

您正在使用.NET標記。你在使用ADO.NET嗎?你正在建立一個文本查詢,還是你正在調用一個存儲過程?

對於普通的vanilla Transact-SQL,如果您有一個表示值列表的字符串,則必須解析字符串並將每個值轉換爲整數。在.NET中沒有內置的Split()函數,但是您有子字符串和索引函數來查找和提取數字。然後,將每個轉換爲一個整數,並將它們存儲在臨時表或表變量中,您將在IN子句中使用該變量。

對於大多數.NET應用程序,對於任何可用的查詢命令解析器,您應該能夠使用該字符串作爲字符串表示查詢的一部分。如果它是基本的ADO,那將是SQL,對於NHibernate,它將是HQL等等。只要設置一個基於字符串的查詢並將其發送到SQL Server,它就會將整個事件解析爲一個命令,而不是轉換在你需要的部分。

+0

我使用的存儲過程,這裏是內容:SELECT的OrderId,的OrderTotal,BillingCountry,OrderStatus.Name AS OrderStatus,PaymentStatus FROM DailyOrders \t INNER JOIN DailyOrderStatus \t ON DailyOrders.OrderStatusID = DailyOrderStatus.OrderStatusID \t INNER JOIN DailyPaymentStatus \t ON DailyOrders.PaymentStatusID = DailyPaymentStatus.PaymentStatusID \t WHERE日期> CAST(@ date1 as datetime)AND Date Laziale 2010-10-08 18:31:55

1

爲此,您可以在SQL Server端,但我不喜歡它:

CREATE FUNCTION [dbo].[Split](@String nvarchar(4000), @Delimiter char(1)) 
returns @Results TABLE (Items nvarchar(4000)) 
as 
begin 
declare @index int 
declare @slice nvarchar(4000) 
select @index = 1 
if @String is null return 
while @index != 0 
begin 
select @index = charindex(@Delimiter,@String) 
if @index !=0 
select @slice = left(@String,@index - 1) 
else 
select @slice = @String 
insert into @Results(Items) values(@slice) 
select @String = right(@String,len(@String) - @index) 
if len(@String) = 0 break 
end return 
end 

然後:

WHERE someintegerfield IN (select * from dbo.Split('30,40,50', ','))