2010-10-08 70 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', ','))