关于SQL中 动态执行SQL语句并且获得动态SQL语句输出参数值的问题

来源:互联网 发布:达梦数据库dm6下载 编辑:程序博客网 时间:2024/06/11 03:47

有些特殊原因,我们需要在SQL语句或者存储过程中动态创建SQL语句,然后在SQL语句或存储过程中动态来执行。

这里,微软提供了两个方法,一个是使用

Execute函数

执行方式为

Execute(@sql)来动态执行一个SQL语句,但是这里的SQL语句无法得到里面的返回结果,下面来介绍另一种方法

使用存储过程 sp_ExecuteSql

使用该存储过程,则可将动态语句中的参数返回来。

比如

declare @sql nvarchar(800),@dd varchar(20)

set @sql='set @mm=''测试字符串'''

exec sp_executesql @sql,N'@mm varchar(20) output',@dd output

select @dd

 

执行他就会将内部创建的SQL语句的某个变量的值返回到外部调用者。

 

 

主要来源于工作中的一个偶然需要:

 

create proc proc_InToServer @收费站点编号 varchar(4),@车道号 tinyint,@进入时间 varchar(23),@UID char(16),
@车牌 varchar(12),@车型 char(1),@识别车牌号 varchar(12),@识别车型 char(1),@收费金额 money,@交易状态 char(1),
@有图像 bit,@离开时间 varchar(23),@速度 float,@HasInsert int output
as
begin
   declare @inTime datetime,@TableName varchar(255),@leaveTime datetime,@HasTable bit,@Sql nvarchar(4000)
  select @intime=Convert(datetime,@进入时间),@leaveTime=Convert(datetime,@离开时间)
  set @TableName='ETC03_01_OBE原始过车记录表_'+dbo.formatDatetime(@intime,'YYYYMMDD')

 select @HasTable=(Case when Count(*)>0 then 1 else 0 end) from sysobjects where id=Object_id(@TableName) and ObjectProperty(id,'IsUserTable')=1
 if @HasTable=0
  begin
    set @Sql='CREATE TABLE [dbo].['+@TableName+'] (
 [收费站点编号] [char] (4) COLLATE Chinese_PRC_CI_AS NOT NULL,
 [车道号] [tinyint] NOT NULL,
 [进入时间] [datetime] NOT NULL,
 [UID] [char] (16) COLLATE Chinese_PRC_CI_AS NOT NULL,
 [车牌] [varchar] (12) COLLATE Chinese_PRC_CI_AS NULL ,
 [车型] [char] (1) COLLATE Chinese_PRC_CI_AS NULL ,
 [识别车牌号] [varchar] (12) COLLATE Chinese_PRC_CI_AS NULL ,
 [识别车型] [char] (1) COLLATE Chinese_PRC_CI_AS NULL ,
 [收费金额] [money] NULL ,
 [交易状态] [char] (1) COLLATE Chinese_PRC_CI_AS NULL ,
 [有图像] [bit] NOT NULL ,
 [离开时间] [datetime] NULL ,
 [速度] [float] NULL,
        Constraint'+' PK_'+@TableName+' primary key(收费站点编号,车道号,进入时间,UID)
        ) ON [PRIMARY]'
     Execute(@Sql)
   end
   set @sql = 'select @Cnt=count(*) from '+@TableName+ ' where 收费站点编号='''+@收费站点编号+''' and  车道号='+cast(@车道号 as varchar(4))+' and 进入时间='''+@进入时间+''' and UID='''+@UID+''''
   set @sql = @sql + ' if @Cnt=0  '
  
   set @sql=@sql+'insert '+@TableName+' values('''+@收费站点编号+''','+cast(@车道号 as varchar(4))+','''+@进入时间+''','''+@Uid+''','''+@车牌+  
   ''','''+@车型+''','''+   @识别车牌号+''','''+@识别车型+''','+Cast(@收费金额 as varchar(8))+','''+@交易状态+''','+cast(@有图像 as varchar(1))+
   ','''+@离开时间+''','+Cast(@速度 as varchar(8))+')'
   --Execute(@sql)
   exec sp_executesql @sql,N'@Cnt int output',@HasInsert output
end

原创粉丝点击