连接存储过程中的参数

时间:2015-02-16 07:07:04

标签: c# asp.net sql-server stored-procedures

我想在存储过程中将参数值与字符串连接起来。 因为我想完成选择查询:where condition。 因为'@size_from'参数必须与字符串连接, 其中包含选择查询。

我的存储过程:

dbo.GetDiamondDetail

 ALTER PROCEDURE [dbo].[GetDiamondDetail]
        @size_from numeric(18,2),
        @size_to numeric(18,2),
        @price_from int,
        @price_to int,
        @price_car_from int,
        @price_car_to int,
        @clarity_from nvarchar(6),
        @clarity_to nvarchar(6),
        @cut_from varchar(50),
        @cut_to varchar(50),
        @color_from varchar(50),
        @color_to varchar(50),
        @certi_lbl varchar(100),
        @depth_from numeric(18,2),
        @depth_to numeric(18,2),
        @table_from numeric(18,2),
        @table_to numeric(18,2),
        @polish_from varchar(50),
        @polish_to varchar(50)


AS
BEGIN
      SET NOCOUNT ON;     

      Declare @Test Varchar(MAX)

        Set @Test=' SELECT  
            dd.stock_no,
          d.diamond_shape,
          d.diamond_img,
          dd.size,
          c.cut_nm,
          co.color_nm,
          clr.clarity_nm,
          dd.off_rap,
          dd.price,
          dd.price_per_carat,
          (dd.price * 2) AS [total_price],
          f.fluo_nm,
          dd.depth,
          dd.diamond_table,
          dd.measurement,
          cert.cert_nm,
          p.polish_type,
          s.symmetry_type,
          dlr.dealer_email

       FROM diamond_detail dd
         JOIN diamond d ON dd.diamond_id=d.diamond_id
         JOIN cut c ON dd.cut_id=c.cut_id
         JOIN color co ON dd.color_id=co.color_id
         JOIN clarity clr ON dd.clarity_id=clr.clarity_id
         JOIN fluorescence f ON dd.fluo_id=f.fluo_id
         JOIN certificate cert ON dd.cert_id=cert.cert_id
         JOIN polish p ON dd.polish_id=p.polish_id
         JOIN symmetry s ON dd.symmetry_id=s.symmetry_id
         JOIN dealer dlr ON dd.dealer_id=dlr.dealer_id 
         JOIN width w ON dd.width_id=w.width_id
    where '


        set @Test=@Test+'dd.size_from>='+@size_from


         PRINT @Test
         EXEC (@Test) 
END

2 个答案:

答案 0 :(得分:0)

为什么要这么复杂并使用字符串?只需执行语句:

 ALTER PROCEDURE [dbo].[GetDiamondDetail]
        @size_from numeric(18,2),
        @size_to numeric(18,2),
        @price_from int,
        @price_to int,
        @price_car_from int,
        @price_car_to int,
        @clarity_from nvarchar(6),
        @clarity_to nvarchar(6),
        @cut_from varchar(50),
        @cut_to varchar(50),
        @color_from varchar(50),
        @color_to varchar(50),
        @certi_lbl varchar(100),
        @depth_from numeric(18,2),
        @depth_to numeric(18,2),
        @table_from numeric(18,2),
        @table_to numeric(18,2),
        @polish_from varchar(50),
        @polish_to varchar(50)


AS
BEGIN
      SET NOCOUNT ON;     

      SELECT  
          dd.stock_no,
          d.diamond_shape,
          d.diamond_img,
          dd.size,
          c.cut_nm,
          co.color_nm,
          clr.clarity_nm,
          dd.off_rap,
          dd.price,
          dd.price_per_carat,
          (dd.price * 2) AS [total_price],
          f.fluo_nm,
          dd.depth,
          dd.diamond_table,
          dd.measurement,
          cert.cert_nm,
          p.polish_type,
          s.symmetry_type,
          dlr.dealer_email

       FROM diamond_detail dd
         JOIN diamond d ON dd.diamond_id=d.diamond_id
         JOIN cut c ON dd.cut_id=c.cut_id
         JOIN color co ON dd.color_id=co.color_id
         JOIN clarity clr ON dd.clarity_id=clr.clarity_id
         JOIN fluorescence f ON dd.fluo_id=f.fluo_id
         JOIN certificate cert ON dd.cert_id=cert.cert_id
         JOIN polish p ON dd.polish_id=p.polish_id
         JOIN symmetry s ON dd.symmetry_id=s.symmetry_id
         JOIN dealer dlr ON dd.dealer_id=dlr.dealer_id 
         JOIN width w ON dd.width_id=w.width_id
    where dd.size_from >= @size_from;

END

答案 1 :(得分:0)

更改代码以处理处理null值的条件,另一方面,在连接时,每个东西都变为null并且不给出结果。

首先,您必须将临时变量声明为NVARCHAR数据类型以接受unicode值。

    --1. do not give where in first string, but check it.

    if(isnull(@size_from,'')  != ''
    set @Test=@Test+' where dd.size_from>='+@size_from


         PRINT @Test
         EXEC (@Test) 
END