CREATE PROCEDURE sp_displaychosencustomers
@id int,
@name varchar(50),
@birth datetime,
@address varchar(50),
@phone varchar(50),
@state varchar(5)
AS
begin
DECLARE @str varchar(255)
if ( @id <> 0)
SET @str = 'ID = ' + @id
if ( (@name is not null) AND @id <> 0 )
SET @str = @str + ' AND NAME = ''' + @name + ''''
else if ( (@name is not null) AND @id = 0 )
SET @str ='NAME = ''' + @name + ''''
if ( ( datediff(dd,@birth,getdate())!=0 ) AND ( @id <> 0 OR ( @name is NOT null ) ))
SET @str = @str + ' AND Birth = ''' + @birth + ''''
else if ( datediff(dd,@birth,getdate())!=0 AND @id = 0 AND @name is null )
SET @str = ( 'Birth= '' + @birth + ''' )
if ( @address is not null AND ( @id <> 0 OR @name is not null OR datediff(dd,@birth,getdate())!=0 ))
SET @str = @str + ' AND ADDRESS = ''' + @address + ''''
else if ( @address is not null AND @id = 0 AND @name is null AND datediff(dd,@birth,getdate())=0 )
SET @str = 'Address = ''' + @address + ''''
if ( @phone is not null AND ( @id = 0 OR @name is not null OR datediff(dd,@birth,getdate())!=0 OR @address is not null ))
SET @str = @str + ' AND PHONE = ''' + @phone + ''''
else if ( @phone is not null AND @id = 0 AND @name is null AND datediff(dd,@birth,getdate())=0 AND @address is null )
SET @str = 'PHONE= ''' + @phone + ''''
if ( @state is not null AND ( @id <> 0 OR @name is not null OR datediff(dd,@birth,getdate())!=0 OR @address is not null OR @phone is not null ))
SET @str = @str + ' AND STATE = ''' + @state + ''''
else if ( @state is not null AND @id = 0 AND @name is null AND datediff(dd,@birth,getdate())=0 AND @address is null AND @phone is null )
SET @str = 'STATE = ' + @state + '''' if (@str is null)
select * from customer
else if (@str is not null )
exec('select * from customer where '+@str)
end我给的参数是:
id=2
name = null
birth = 2/13/2009(就是当天的日期)
address,phone,state也都是null但返回的表格是空表格,不知道是哪里不对,请大家帮我看看吧
@id int,
@name varchar(50),
@birth datetime,
@address varchar(50),
@phone varchar(50),
@state varchar(5)
AS
begin
DECLARE @str varchar(255)
if ( @id <> 0)
SET @str = 'ID = ' + @id
if ( (@name is not null) AND @id <> 0 )
SET @str = @str + ' AND NAME = ''' + @name + ''''
else if ( (@name is not null) AND @id = 0 )
SET @str ='NAME = ''' + @name + ''''
if ( ( datediff(dd,@birth,getdate())!=0 ) AND ( @id <> 0 OR ( @name is NOT null ) ))
SET @str = @str + ' AND Birth = ''' + @birth + ''''
else if ( datediff(dd,@birth,getdate())!=0 AND @id = 0 AND @name is null )
SET @str = ( 'Birth= '' + @birth + ''' )
if ( @address is not null AND ( @id <> 0 OR @name is not null OR datediff(dd,@birth,getdate())!=0 ))
SET @str = @str + ' AND ADDRESS = ''' + @address + ''''
else if ( @address is not null AND @id = 0 AND @name is null AND datediff(dd,@birth,getdate())=0 )
SET @str = 'Address = ''' + @address + ''''
if ( @phone is not null AND ( @id = 0 OR @name is not null OR datediff(dd,@birth,getdate())!=0 OR @address is not null ))
SET @str = @str + ' AND PHONE = ''' + @phone + ''''
else if ( @phone is not null AND @id = 0 AND @name is null AND datediff(dd,@birth,getdate())=0 AND @address is null )
SET @str = 'PHONE= ''' + @phone + ''''
if ( @state is not null AND ( @id <> 0 OR @name is not null OR datediff(dd,@birth,getdate())!=0 OR @address is not null OR @phone is not null ))
SET @str = @str + ' AND STATE = ''' + @state + ''''
else if ( @state is not null AND @id = 0 AND @name is null AND datediff(dd,@birth,getdate())=0 AND @address is null AND @phone is null )
SET @str = 'STATE = ' + @state + '''' if (@str is null)
select * from customer
else if (@str is not null )
exec('select * from customer where '+@str)
end我给的参数是:
id=2
name = null
birth = 2/13/2009(就是当天的日期)
address,phone,state也都是null但返回的表格是空表格,不知道是哪里不对,请大家帮我看看吧
CREATE PROCEDURE sp_displaychosencustomers
@id int,
@name varchar(50),
@birth datetime,
@address varchar(50),
@phone varchar(50),
@state varchar(5)
AS
begin
DECLARE @str nvarchar(4000); SELECT
@str =
CASE
WHEN @id <> 0 THEN N' AND ID = @id'
ELSE N''
END
+ CASE
WHEN @name IS NOT NULL THEN N' AND NAME = @name'
ELSE N''
END
+ CASE
WHEN DATEDIFF(Day, @birth, GETDATE()) <> 0 THEN N' AND Birth = @birth'
ELSE N''
END
+ CASE
WHEN @address IS NOT NULL THEN N' AND ADDRESS = @address'
ELSE N''
END
+ CASE
WHEN @phone IS NOT NULL THEN N' AND PHONE = @phone'
ELSE N''
END
+ CASE
WHEN @state IS NOT NULL THEN N' AND STATE = @state'
ELSE N''
END;
IF @str <> N''
SET @str = STUFF(@str, 1, 4, N' WHERE ');
SET @str = N'select * from customer ' + @str;
EXEC sp_executesql
@str,
N'
@id int,
@name varchar(50),
@birth datetime,
@address varchar(50),
@phone varchar(50),
@state varchar(5)
',
@id, @name, @birth, @address, @phone, @state;
end
1 Alen 1/1/1970 12:00:00 AM 18231 barroso st 6019250001 AL
2 Bob 2/2/1971 12:00:00 AM 6019250002 CA
3 Carter 3/3/1972 12:00:00 AM 6019250003 CT
4 David 4/4/1973 12:00:00 AM NULL 6019250004 CA
5 Evan 5/5/1974 12:00:00 AM NULL 6019250005 AR
6 Ford 6/6/1975 12:00:00 AM NULL 6019250006 FL
7 Hanna 7/7/1976 12:00:00 AM NULL 6019250007 FL
8 Ilian 8/8/1977 12:00:00 AM NULL 6019250008 HI
9 Jack 9/9/1978 12:00:00 AM NULL 6019250009 IN
10 Ken 10/10/1979 12:00:00 AM NULL 6019250010 IN
11 Loen 11/11/1980 12:00:00 AM NULL 6019250011 HI
12 Mark 12/12/1981 12:00:00 AM NULL 6019250012 MI
13 Nancy 1/2/1982 12:00:00 AM NULL 6019250013 NJ
14 Oliver 2/2/1983 12:00:00 AM NULL 6019250014 NY
15 Peter 3/2/1984 12:00:00 AM NULL 6019250015 NJ
16 Queen 4/2/1985 12:00:00 AM NULL 6019250016 MI
17 Roy 5/2/1986 12:00:00 AM NULL 6019250017 WA
18 Sue 6/2/1987 12:00:00 AM NULL 6019250018 UT
19 Tae 7/2/1988 12:00:00 AM NULL 6019250019 UT
20 Uli 8/2/1989 12:00:00 AM NULL 6019250020 WA
21 Vivian 9/2/1990 12:00:00 AM NULL 6019250021 CA
22 Walt 10/2/1991 12:00:00 AM NULL 6019250022 OH
23 Xenia 11/3/1992 12:00:00 AM NULL 6019250023 TX
24 Yolanda 12/3/1993 12:00:00 AM NULL 6019250024 OH
25 Zero 1/3/1994 12:00:00 AM NULL 6019250025 TX
1 Alen 1/1/1970 12:00:00 AM 18231 barroso st 6019250001 AL
2 Bob 2/2/1971 12:00:00 AM 6019250002 CA
3 Carter 3/3/1972 12:00:00 AM 6019250003 CT
4 David 4/4/1973 12:00:00 AM NULL 6019250004 CA
5 Evan 5/5/1974 12:00:00 AM NULL 6019250005 AR
6 Ford 6/6/1975 12:00:00 AM NULL 6019250006 FL
7 Hanna 7/7/1976 12:00:00 AM NULL 6019250007 FL
8 Ilian 8/8/1977 12:00:00 AM NULL 6019250008 HI
9 Jack 9/9/1978 12:00:00 AM NULL 6019250009 IN
10 Ken 10/10/1979 12:00:00 AM NULL 6019250010 IN
11 Loen 11/11/1980 12:00:00 AM NULL 6019250011 HI
12 Mark 12/12/1981 12:00:00 AM NULL 6019250012 MI
13 Nancy 1/2/1982 12:00:00 AM NULL 6019250013 NJ
14 Oliver 2/2/1983 12:00:00 AM NULL 6019250014 NY
15 Peter 3/2/1984 12:00:00 AM NULL 6019250015 NJ
16 Queen 4/2/1985 12:00:00 AM NULL 6019250016 MI
17 Roy 5/2/1986 12:00:00 AM NULL 6019250017 WA
18 Sue 6/2/1987 12:00:00 AM NULL 6019250018 UT
19 Tae 7/2/1988 12:00:00 AM NULL 6019250019 UT
20 Uli 8/2/1989 12:00:00 AM NULL 6019250020 WA
21 Vivian 9/2/1990 12:00:00 AM NULL 6019250021 CA
22 Walt 10/2/1991 12:00:00 AM NULL 6019250022 OH
23 Xenia 11/3/1992 12:00:00 AM NULL 6019250023 TX
24 Yolanda 12/3/1993 12:00:00 AM NULL 6019250024 OH
25 Zero 1/3/1994 12:00:00 AM NULL 6019250025 TX
------------------------------------
现在 14 号了, 你传递的参数是 13 号, 没有满足条件的数据是正常的啊, 如果不管日期, 你可以传递 null 值进去
ID int,
name varchar(50),
birth datetime,
address varchar(50),
phone varchar(50),
state varchar(5)
)
INSERT customer
SELECT 1, 'Alen', '1/1/1970 12:00:00 AM', '18231 barroso st', '6019250001', 'AL' UNION ALL
SELECT 2, 'Bob', '2/2/1971 12:00:00 AM', '', '6019250002', 'CA' UNION ALL
SELECT 3, 'Carter', '3/3/1972 12:00:00 AM', '', '6019250003', 'CT'
GOCREATE PROCEDURE sp_displaychosencustomers
@id int,
@name varchar(50),
@birth datetime,
@address varchar(50),
@phone varchar(50),
@state varchar(5)
AS
begin
DECLARE @str nvarchar(4000); SELECT
@str =
CASE
WHEN @id <> 0 THEN N' AND ID = @id'
ELSE N''
END
+ CASE
WHEN @name IS NOT NULL THEN N' AND NAME = @name'
ELSE N''
END
+ CASE
WHEN DATEDIFF(Day, @birth, GETDATE()) <> 0 THEN N' AND Birth = @birth'
ELSE N''
END
+ CASE
WHEN @address IS NOT NULL THEN N' AND ADDRESS = @address'
ELSE N''
END
+ CASE
WHEN @phone IS NOT NULL THEN N' AND PHONE = @phone'
ELSE N''
END
+ CASE
WHEN @state IS NOT NULL THEN N' AND STATE = @state'
ELSE N''
END;
IF @str <> N''
SET @str = STUFF(@str, 1, 4, N' WHERE ');
SET @str = N'select * from customer ' + @str;
EXEC sp_executesql
@str,
N'
@id int,
@name varchar(50),
@birth datetime,
@address varchar(50),
@phone varchar(50),
@state varchar(5)
',
@id, @name, @birth, @address, @phone, @state;
end
GOEXEC sp_displaychosencustomers
@id = 2,
@name = NULL,
@birth = NULL,
@address = NULL,
@phone = NULL,
@state = NULL
EXEC sp_displaychosencustomers
@id = 2,
@name = NULL,
@birth = '2/14/2009',
@address = NULL,
@phone = NULL,
@state = NULL
GODROP PROC sp_displaychosencustomers;
DROP TABLE customer;
2 Bob 1971-02-02 00:00:00.000 6019250002 CA
@str,
N'
@id int,
@name varchar(50),
@birth datetime,
@address varchar(50),
@phone varchar(50),
@state varchar(5)
',
@id, @name, @birth, @address, @phone, @state;
end
GO
出来的结果要么是说:
Msg 8114, Level 16, State 5, Procedure sp_displaychosencustomers, Line 0
从数据类型 nvarchar 转换为 datetime 时出错。
(1 row(s) affected)要么就是返回一个空的表格。
GODECLARE @return_value intEXEC @return_value = [dbo].[sp_displaychosencustomers]
@id = 2,
@name = N'null',
@birth = N'null',
@address = N'null',
@phone = N'null',
@state = N'null'SELECT 'Return Value' = @return_valueGO
GO DECLARE @return_value int EXEC @return_value = [dbo].[sp_displaychosencustomers]
@id = 2,
@name = NULL,
@birth = NULL,
@address = NULL,
@phone = NULL,
@state = NULL SELECT 'Return Value' = @return_value GO
那在Execute Procedure [dbo].[sp_displaychosencustomers]的对话框里,我应该怎么输入空值呢?
GODECLARE @return_value intEXEC @return_value = [dbo].[sp_displaychosencustomers]
@id = 2,
@name = NULL,
@birth = NULL,
@address = NULL,
@phone = NULL,
@state = NULLSELECT 'Return Value' = @return_valueGO但是错误信息说:
Msg 208, Level 16, State 1, Line 8
对象名 'Customer' 无效。
这是怎么回事啊?
对象名无效, 那是你自己要解决的问题, 我怎么知道你的'Customer'表在那