紧急求助!存储过程的问题:动态sql返回数据集问题 假设有一个财务sql表[id,sql],sql是一个sql语句,是一个计算财务合计值的语句,我想写一个存储过程,通过调用财务sql表,能够返回一个一列多行的数据集?可行吗?如何写?伪代码也行,刚接触存储过程,多谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 动态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 create proc test(@id int)as begin declare @sql varchar(4000) select @sql=sql from 表 where id=@id exec(@sql) end当然,要确保你保存在SQL字段的语句是正确的. 看了,输出参数是一个,但是财务sql表[id,sql]是多条记录,如何返回所有的值,循环吗? fcuandy 你的我测试了,可以,但是财务sql表[id,sql]是多条记录,如何返回所有的值,循环吗? 1.既然表中的列内容为一个SQL语句,你可以将这条语句也完整来达到自己的目的 在需要生成特定的报表时,只需要查询到这条语句就可以2.如果一条语句无法实现,可以利用UNION ALL将两条或多条语句的结果连接起来 例如: Declare @sql varchar(1000) Select @sql='' Select @sql=@sql + ' UNION ALL ' + SQL From 表名 Where 条件过滤 exec(@SQL)3.或者利用游标来实现一条一条语句来执行操作 游标的写法可以参考SQL Server的联机帮助来做 对,用大家所说的EXEC先组成动态SQL语句,再exec(SQL语句) LZ,你可以用SQL里的函数来实现,给个例子你看看就知道了CREATE function F_KCSL (@RQ1 DATETIME,@RQ2 DATETIME) --括号里为参数 这个函数返回的是一个表@LSBWreturns @LSBW table (SPIDH INTEGER,spmc varchar(50),spbm varchar(20),DW VARCHAR(20),SL NUMERIC(10,2),JSL NUMERIC(10,2),QCKC NUMERIC(10,2),XYKC NUMERIC(10,2),QCDJ NUMERIC(10,4),JCDJ NUMERIC(10,4)) AS BEGIN --对表的操作 RETURNEND在查询分析器中直接写SELECT * FROM F_KCSL(参数) 即可 函数只能返回SQL语句,不能对表直接操作吧 菜鸟问一个简单的触发器问题。。求关照 sql变量做表名查询问题 求写一条查询语句 查询问题 关于SQL维护计划的问题 sql server 2000中怎样按时间分组筛选数据 dts导入的问题。 数据库字段拆分,求解 为何多个终端通过TCP/IP连接上sqlserver进行数据操作的时候,服务器会被拖的超慢?而通过namepipes连却不会呢? 如何查看sql server 打了多少版本的service pack 急啊,救命 请问这样一组数据如何格式化,希望用函数实现!进来看看,在DELPHI里面函数实现了,但在SQL 里面函数怎样写呢? 统计取值问题?
动态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
(@id int)
as
begin
declare @sql varchar(4000)
select @sql=sql from 表 where id=@id
exec(@sql)
end当然,要确保你保存在SQL字段的语句是正确的.
在需要生成特定的报表时,只需要查询到这条语句就可以2.如果一条语句无法实现,可以利用UNION ALL将两条或多条语句的结果连接起来
例如:
Declare @sql varchar(1000)
Select @sql=''
Select @sql=@sql + ' UNION ALL ' + SQL From 表名 Where 条件过滤
exec(@SQL)3.或者利用游标来实现一条一条语句来执行操作
游标的写法可以参考SQL Server的联机帮助来做
CREATE function F_KCSL (@RQ1 DATETIME,@RQ2 DATETIME) --括号里为参数 这个函数返回的是一个表@LSBW
returns @LSBW table (SPIDH INTEGER,spmc varchar(50),spbm varchar(20),DW VARCHAR(20),SL NUMERIC(10,2),JSL NUMERIC(10,2),QCKC NUMERIC(10,2),XYKC NUMERIC(10,2),QCDJ NUMERIC(10,4),JCDJ NUMERIC(10,4))
AS
BEGIN
--对表的操作
RETURN
END
在查询分析器中直接写SELECT * FROM F_KCSL(参数) 即可