代码之家  ›  专栏  ›  技术社区  ›  Laziale

在sql中强制转换多个整数值

  •  0
  • Laziale  · 技术社区  · 14 年前

    我想将来自.net解决方案的多个变量强制转换为整数。 像这样的: 我使用IN关键字选择多个关键字,因为我不知道客户选择了多少个变量,我将它们放入nvarchar变量中。

    例子:

    选择的状态ID:30、40、50

    '30,40,50'作为sql nvarchar参数传递给sql服务器

    我想把它们转换成整数 IN(铸造(30,40,50,内部) 这样我就错了。

    有人能帮助我如何设置正确的sql语法吗。 谢谢,拉齐亚尔

    4 回复  |  直到 14 年前
        1
  •  0
  •   Aliostad    14 年前

    最好是在客户机上构造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);
    

    更新

    对于那些认为这是为了 SQL注入 ,数字列表由应用程序创建,用户仅从列表中选择项。所以这对用户和可能的SQL注入是不开放的。

        2
  •  1
  •   Luke Hutton    14 年前

    您可以在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', ','))
    
        3
  •  0
  •   KeithS    14 年前

    您正在使用.NET标记。你在用ADO.NET?您是在设置文本查询,还是在调用存储过程?

    对于普通的Transact-SQL,如果有一个表示值列表的字符串,则必须解析该字符串并将每个值转换为整数。在.NET中没有内置的Split()函数,但您确实有子字符串和函数索引来查找和提取数字。然后,将每一个转换成一个整数,并将它们存储在临时表或表变量中,您将在in子句中使用它们。

    对于大多数.NET应用程序,您应该能够将字符串用作字符串表示的查询的一部分,对于任何可用的查询命令解析器。如果是基本的ADO,那就是SQL,对于NHibernate,就是HQL,等等。只需设置一个基于字符串的查询并将其发送到SQL Server,它就会将整个过程解析为一个命令,而不需要转换。

        4
  •  0
  •   Muhammad Hani    14 年前
    SELECT *
    FROM YourTable
    WHERE StatusId IN(CAST('30' AS int),CAST('40' AS int),CAST('50' AS int))