我想在存储过程中将参数值与字符串连接起来。 因为我想完成选择查询: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
答案 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