请教专家MSSQL存储过程的问题
以下是存储过程代码,在delphi中复杂查询要调用它的结果集
create procedure find_employee
@id char(8),
@name nvarchar(8),
@title nvarchar(16),
as
select * from employee where (id = @id) AND (name = @name) AND (title = @title)
go
我的问题是怎样通过外部输入的参数改变select语句的连接操作符AND,比如输入'AND'还是AND,输入'OR'就变成OR。我试过用字符变量替换但不行,如果在存储过程中用if条件来选择select语句,delphi提示不能返回结果集
问题点数:60、回复次数:7Top
1 楼WangZWang(先来)回复于 2006-06-01 15:48:43 得分 20
--用动态语句,如:
create procedure find_employee
@id char(8),
@name nvarchar(8),
@title nvarchar(16),
@orAnd nvarchar(20)
as
exec('
select * from employee where (id = '+@id+') '+@orAnd+'
(name = '''+@name+''') '+@orAnd+' (title = '''+@title+'''')
go
Top
2 楼xeqtr1982(Visual C# .NET)回复于 2006-06-01 15:53:02 得分 10
alter procedure find_employee
@id char(8),
@name nvarchar(8),
@title nvarchar(16),
@t varchar(3)
as
declare @sql varchar(8000)
set @sql='select * from employee where (id = '+rtrim(@id)+') '+@t+' (name = '''+@name+''') '+@t+' (title = '''+@title+''')'
exec(@sql)
go
exec find_employee '1','a','b','and'
exec find_employee '1','a','b','or'Top
3 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-01 15:53:30 得分 10
用動態SQL語句
create procedure find_employee
@id char(8),
@name nvarchar(8),
@title nvarchar(16),
@str nvarchar(10)
as
Declare @S Nvarchar(4000)
Set @S='select * from employee where (id = '''+Rtrim(@id)+''') '+@str+' (name = '''+@name+''') '+@str+' (title = '''+@title+''')'''
EXEC(@S)
go
Top
4 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-01 15:54:21 得分 0
哈,慢了Top
5 楼xeqtr1982(Visual C# .NET)回复于 2006-06-01 15:55:16 得分 0
如果需要前后的运算符不同,那么可以定义2个变量Top
6 楼wangtiecheng(不知不为过,不学就是错!)回复于 2006-06-01 15:55:57 得分 20
--用动态语句,如:
create procedure find_employee
@id char(8),
@name nvarchar(8),
@title nvarchar(16),
@orAnd nvarchar(20)
as
declare @sql nvarchar(8000)
exec('select * from employee where (id = ' + @id + ')' + @orAnd + '(name ''' + @name + ''') ' + @orAnd + ' (title = ''' + @title + '''')
go
--------------------------------------------------------------------------------
动态sql语句基本语法
1 :普通SQL语句可以用Exec执行
eg: Select * from tableName
Exec('select * from tableName')
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N
2:字段名,表名,数据库名之类作为变量时,必须用动态SQL
eg:
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
Exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格
当然将字符串改成变量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --设置字段名
declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句会报错
declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正确
3. 输出参数
declare @num int,
@sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)
--如何将exec执行结果放入变量中?
declare @num int,
@sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num
Top
7 楼zhouyao_99(周耀)回复于 2006-06-02 08:33:07 得分 0
谢谢大家!MSSQL论坛的人总是很热心,我还有一个小问题SQL Server 2000 Enterprise装在Win2003 Enterprise下本机可正常运行,远程的客户无法访问它,我用netstat -na发现服务器的1433端口没有打开,在SQL Server的'服务器实用工具'中查看端口是1433,我只有SQL Server 2000并想装在Win2003 Enterprise能办到吗?谢谢各位高人!Top




