如何使此SQL查询更加动态和线性?

如何使此SQL查询更加动态和线性?,sql,sql-server,Sql,Sql Server,我有一个名为view\u FORM\u SALE\u SUBMISSION\u INFO的视图 我有疑问 select a.FormSl from VIEW_FORM_SALE_SUBMISSION_INFO as a where FormSl between convert(int,'113990') and convert(int,'1131000') 我的目标: 我想将这两个值作为参数传递到convert()函数中 我希望这个查询更加线性,也就是说,我可以在这个查询之前进行这些转换,这

我有一个名为
view\u FORM\u SALE\u SUBMISSION\u INFO的视图

我有疑问

select a.FormSl 
from VIEW_FORM_SALE_SUBMISSION_INFO as a
where FormSl between convert(int,'113990') and convert(int,'1131000')
我的目标:

  • 我想将这两个值作为参数传递到
    convert()
    函数中
  • 我希望这个查询更加线性,也就是说,我可以在这个查询之前进行这些转换,这样我就可以使用between运算符,而不需要尽可能简单

  • 要对此进行参数化,可以创建一个表值函数

    CREATE FUNCTION myFunction (@lower_bound AS VARCHAR(32), @upper_bound AS VARCHAR(32))
    RETURNS TABLE AS
    RETURN
    select a.FormSl 
    from VIEW_FORM_SALE_SUBMISSION_INFO as a
    where FormSl between convert(int,@lower_bound) and convert(int,@upper_bound)
    
    
    SELECT * FROM dbo.myFunction('11111', '22222')
    
    就优化转换而言,您所拥有的将是最佳的


    如果您想进一步改进它,请不要传入字符串,而是首先传入整数。

    要将其参数化,您可以创建一个表值函数

    CREATE FUNCTION myFunction (@lower_bound AS VARCHAR(32), @upper_bound AS VARCHAR(32))
    RETURNS TABLE AS
    RETURN
    select a.FormSl 
    from VIEW_FORM_SALE_SUBMISSION_INFO as a
    where FormSl between convert(int,@lower_bound) and convert(int,@upper_bound)
    
    
    SELECT * FROM dbo.myFunction('11111', '22222')
    
    就优化转换而言,您所拥有的将是最佳的

    如果您想进一步改进它,请不要传入字符串,而是首先传入整数。

    这怎么样

    select a.FormSl 
    from VIEW_FORM_SALE_SUBMISSION_INFO as a
    where FormSl between @param1 and @param2
    
    其中
    @param1
    @param2
    是整数参数?

    这个怎么样

    select a.FormSl 
    from VIEW_FORM_SALE_SUBMISSION_INFO as a
    where FormSl between @param1 and @param2
    

    其中
    @param1
    @param2
    是整数参数?

    为什么需要
    转换
    ?如果FormS1是int,请使用
    ,其中FormSl介于113990和1131000之间
    @Mikael Eriksson:我需要转换,因为between不用于比较,因为我的两个字符串长度可变抱歉,我不明白。如果FormSl是
    int
    ,那么参数应该是
    int
    。如果FormSl不是
    int
    但存储整数,则应将FormSl的数据类型更改为
    int
    。如果FormSl中有非整数值,您的查询将出现转换错误,因为FormSl已隐式转换为整数。很抱歉,Mikael,我正在处理某人的hoalf daone工作,其中FormSl是由一个war数据的前3个字符生成的,我在其中添加了一个自动递增的数字。首先,在我的应用程序中,我将所有formsl都设置为7个字符,用零左键填充,但为了保持他的工作不变,我必须同时使用6个字符,例如113999和1131000,因为这两个字符都是字符串,因此在使用between运算符时,我必须使用零或转换为整数的Lpad为什么需要
    转换
    ?如果FormS1是int,请使用
    ,其中FormSl介于113990和1131000之间
    @Mikael Eriksson:我需要转换,因为between不用于比较,因为我的两个字符串长度可变抱歉,我不明白。如果FormSl是
    int
    ,那么参数应该是
    int
    。如果FormSl不是
    int
    但存储整数,则应将FormSl的数据类型更改为
    int
    。如果FormSl中有非整数值,您的查询将出现转换错误,因为FormSl已隐式转换为整数。很抱歉,Mikael,我正在处理某人的hoalf daone工作,其中FormSl是由一个war数据的前3个字符生成的,我在其中添加了一个自动递增的数字。首先,在我的应用程序中,我将所有formsl都设置为7个字符,用零填充,但为了保持他的工作不变,我必须同时使用6个字符,例如113999和1131000,因为这两个字符都是字符串。因此,在使用BEVER运算符时,我必须使用零Lpad或转换为整数