貌似我个人拙见跟楼上几位仁兄的意思有点相似,应该没理解错误。 那请大家看看我下面这么写有说明问题吗?ALTER proc [dbo].[proc_SwiftNumber_TaskFlow] ( @tblName nvarchar(200), --表名 @colName nvarchar(200), --列名 @prefix nvarchar(100), --流水号的前缀 @length int, --流水号长度 @SwiftNumber varchar(100) output --流水号 ) as begin DECLARE @sql nvarchar(1000) DECLARE @Con varchar(1000) set @Con='' DECLARE @result varchar(100) set @result='' Select @Con=code from DocumentalInfo where Convert(varchar(100),@colName,112) like ''+@prefix+Convert(varchar(100),getdate(),112)+'%' order by code if @Con='' begin set @result=Convert(varchar(100),getdate(),112)+'01' end else begin Set @result=right(@Con,2) set @result= Convert(varchar(100),getdate(),112)+@result+1 end SELECT @sql = 'SELECT @SwiftNumber=('''+ @prefix +''' + '''+@result+''')' exec sp_executesql @sql,N'@SwiftNumber varchar(100) out',@SwiftNumber out end这个存储过程主要是实现生成流水号(格式='类型字符'+'年月日'+'编号',如:QJ2010060801 ,QJ2010060802,etc)
Select @Con=code from DocumentalInfo where Convert(varchar(100),@colName,112) like ''+@prefix+Convert(varchar(100),getdate(),112)+'%' order by code 这个不会报错吗??
你这不需要那么做吧这样就可以 ALTER proc [dbo].[proc_SwiftNumber_TaskFlow] ( @tblName nvarchar(200), --表名 @colName nvarchar(200), --列名 @prefix nvarchar(100), --流水号的前缀 @length int, --流水号长度 @SwiftNumber varchar(100) output --流水号 ) as begin DECLARE @sql nvarchar(1000) DECLARE @Con varchar(1000) set @Con='' DECLARE @result varchar(100) set @result='' Select @Con=code from DocumentalInfo where Convert(varchar(100),@colName,112) like ''+@prefix+Convert(varchar(100),getdate(),112)+'%' order by code if @Con is null or @Con='' begin set @result=Convert(varchar(100),getdate(),112)+'01' end else begin Set @result=right(@Con,2) set @result= Convert(varchar(100),getdate(),112)+@result+1 end SELECT @SwiftNumber=@prefix +@result end
Select @Con=code from DocumentalInfo where Convert(varchar(100),@colName,112) like ''+@prefix+Convert(varchar(100),getdate(),112)+'%' order by code 这句是有问题,应该动态执行, 不过你要先解释一下,怎么回事
sqlserver t-sql sp_executesql 用法大全举例 /***************输入一个参数********************/ declare @sql Nvarchar(1000) declare @t1 int set @t1=55; exec sp_executesql N'select @t2' --执行的语句,若是变量的话,只可以是Nvarchar变量 ,N'@t2 int' --声明执行语句内的参数,若是变量的话,只可以是Nvarchar变量 ,@t2=@t1 --为语句内的参数赋值,左边是语句内的参数,右边是值。 /****************输入多个参数********************/ declare @sql Nvarchar(1000) declare @t1 int set @t1=55; exec sp_executesql N'select @t2,@t1' --执行的语句,若是变量的话,只可以是Nvarchar变量 ,N'@t2 int,@t1 int' --声明执行语句内的参数,若是变量的话,只可以是Nvarchar变量 ,@t2=@t1,@t1=88 --为语句内的参数赋值,左边是语句内的参数,右边是值。 /**************只输出一个参数*********************/ declare @sql Nvarchar(1000) declare @tt2 int exec sp_executesql N'select @t2=200' --执行的语句,若是变量的话,只可以是Nvarchar变量 ,N'@t2 int output' --声明执行语句内的参数,若是变量的话,只可以是Nvarchar变量 ,@t2 = @tt2 output --外部变量接收输出output。 select @tt2/**********同时输入参数又输出参数************/ declare @sql Nvarchar(1000) declare @tt int declare @t1 int set @t1=50; exec sp_executesql N'select @tt2=@t2+@t3' --执行的语句,若是变量的话,只可以是Nvarchar变量 ,N'@t2 int,@t3 int,@tt2 int output' --为语句内的参数赋值,左边是语句内的参数,右边是值。 ,@t2=@t1,@t3=50,@tt2=@tt output --语句内的参数赋值--左边是语句内的参数,右边是值。 --输出参数--声名外部的接收变量,因为有了输入参数,因此必须指明那个语句内变量为输出变量. select @tt
这样改一下试试 ALTER proc [dbo].[proc_SwiftNumber_TaskFlow] ( @tblName nvarchar(200), --表名 @colName nvarchar(200), --列名 @prefix nvarchar(100), --流水号的前缀 @length int, --流水号长度 @SwiftNumber varchar(100) output --流水号 ) as begin DECLARE @sql nvarchar(1000) DECLARE @Con varchar(1000) set @Con='' DECLARE @result varchar(100) set @result='' set @sql='Select @Con=code from DocumentalInfo where datediff(d,'+@colName+'getdate())=0' exec sp_executesql @sql,N'@con varchar(1000) output',@Con output if @Con is null or @Con='' begin set @result=Convert(varchar(100),getdate(),112)+'01' end else begin Set @result=right(@Con,2) set @result= Convert(varchar(100),getdate(),112)+@result+1 end SELECT @SwiftNumber=@prefix +@result end
恩,不会报错,真个PROC语法没问题。这个的意思是: 查询数据表里面是否有当天添加(Convert(varchar(100),getdate(),112))的并且编号类型相同(@prefix)的数据。 如:Select @Con=code from DocumentalInfo where Convert(varchar(100),Code,112) like 'QJ'+'20100608'+'%' order by code --用'QJ20100608%'去模糊查询!
执行可以多次重用或动态生成的 Transact-SQL 语句或批处理。Transact-SQL 语句或批处理可以包含嵌入参数。语法
sp_executesql [@stmt =] stmt
[
{, [@params =] N'@parameter_name data_type [,...n]' }
{, [@param1 =] 'value1' [,...n] }
]参数
[@stmt =] stmt包含 Transact-SQL 语句或批处理的 Unicode 字符串,stmt 必须是可以隐式转换为 ntext 的 Unicode 常量或变量。不允许使用更复杂的 Unicode 表达式(例如使用 + 运算符串联两个字符串)。不允许使用字符常量。如果指定常量,则必须使用 N 作为前缀。例如,Unicode 常量 N'sp_who' 是有效的,但是字符常量 'sp_who' 则无效。字符串的大小仅受可用数据库服务器内存限制。stmt 可以包含与变量名形式相同的参数,例如:N'SELECT * FROM Employees WHERE EmployeeID = @IDParameter'stmt 中包含的每个参数在 @params 参数定义列表和参数值列表中均必须有对应项。[@params =] N'@parameter_name data_type [,...n]'字符串,其中包含已嵌入到 stmt 中的所有参数的定义。该字符串必须是可以隐式转换为 ntext 的 Unicode 常量或变量。每个参数定义均由参数名和数据类型组成。n 是表明附加参数定义的占位符。stmt 中指定的每个参数都必须在 @params 中定义。如果 stmt 中的 Transact-SQL 语句或批处理不包含参数,则不需要 @params。该参数的默认值为 NULL。[@param1 =] 'value1'参数字符串中定义的第一个参数的值。该值可以是常量或变量。必须为 stmt 中包含的每个参数提供参数值。如果 stmt 中包含的 Transact-SQL 语句或批处理没有参数,则不需要值。n附加参数的值的占位符。这些值只能是常量或变量,而不能是更复杂的表达式,例如函数或使用运算符生成的表达式。
declare @prefix varchar(100)
declare @result varchar(100)
declare @sql nvarchar(1000)
declare @SwiftNumber nvarchar(1000) output
--前面定义部分就不说了 SELECT @sql = 'SELECT @SwiftNumber=('''+ @prefix +''' + '''+@result+''')' --拼接字符串,组成查询语句,其中含有要赋值的一个变量@SwiftNumber
exec sp_executesql @sql,N'@SwiftNumber varchar(100) out',@SwiftNumber out --执行拼接的sql,并将拼接中的参数进行定义,最后输出给变量 @SwiftNumber
declare @result varchar(100)
declare @sql nvarchar(1000)
declare @SwiftNumber nvarchar(1000) output
--前面定义部分就不说了 SELECT @sql = 'SELECT @SwiftNumber=('''+ @prefix +''' + '''+@result+''')'
--拼接字符串,组成查询语句,其中含有要赋值的一个变量@SwiftNumber
exec sp_executesql @sql,N'@SwiftNumber varchar(100) out',@SwiftNumber out
--执行拼接的sql,并将拼接中的参数进行定义,最后输出给变量 @SwiftNumber
貌似我个人拙见跟楼上几位仁兄的意思有点相似,应该没理解错误。
那请大家看看我下面这么写有说明问题吗?ALTER proc [dbo].[proc_SwiftNumber_TaskFlow]
(
@tblName nvarchar(200), --表名
@colName nvarchar(200), --列名
@prefix nvarchar(100), --流水号的前缀
@length int, --流水号长度
@SwiftNumber varchar(100) output --流水号
)
as
begin
DECLARE @sql nvarchar(1000)
DECLARE @Con varchar(1000) set @Con=''
DECLARE @result varchar(100) set @result=''
Select @Con=code from DocumentalInfo where Convert(varchar(100),@colName,112) like ''+@prefix+Convert(varchar(100),getdate(),112)+'%' order by code
if @Con=''
begin
set @result=Convert(varchar(100),getdate(),112)+'01'
end
else
begin
Set @result=right(@Con,2)
set @result= Convert(varchar(100),getdate(),112)+@result+1
end
SELECT @sql = 'SELECT @SwiftNumber=('''+ @prefix +''' + '''+@result+''')'
exec sp_executesql @sql,N'@SwiftNumber varchar(100) out',@SwiftNumber out
end这个存储过程主要是实现生成流水号(格式='类型字符'+'年月日'+'编号',如:QJ2010060801 ,QJ2010060802,etc)
这个不会报错吗??
ALTER proc [dbo].[proc_SwiftNumber_TaskFlow]
(
@tblName nvarchar(200), --表名
@colName nvarchar(200), --列名
@prefix nvarchar(100), --流水号的前缀
@length int, --流水号长度
@SwiftNumber varchar(100) output --流水号
)
as
begin
DECLARE @sql nvarchar(1000)
DECLARE @Con varchar(1000) set @Con=''
DECLARE @result varchar(100) set @result=''
Select @Con=code from DocumentalInfo where Convert(varchar(100),@colName,112) like ''+@prefix+Convert(varchar(100),getdate(),112)+'%' order by code
if @Con is null or @Con=''
begin
set @result=Convert(varchar(100),getdate(),112)+'01'
end
else
begin
Set @result=right(@Con,2)
set @result= Convert(varchar(100),getdate(),112)+@result+1
end
SELECT @SwiftNumber=@prefix +@result
end
不过你要先解释一下,怎么回事
sqlserver t-sql sp_executesql 用法大全举例
/***************输入一个参数********************/
declare @sql Nvarchar(1000)
declare @t1 int
set @t1=55;
exec sp_executesql
N'select @t2' --执行的语句,若是变量的话,只可以是Nvarchar变量
,N'@t2 int' --声明执行语句内的参数,若是变量的话,只可以是Nvarchar变量
,@t2=@t1 --为语句内的参数赋值,左边是语句内的参数,右边是值。
/****************输入多个参数********************/
declare @sql Nvarchar(1000)
declare @t1 int
set @t1=55;
exec sp_executesql
N'select @t2,@t1' --执行的语句,若是变量的话,只可以是Nvarchar变量
,N'@t2 int,@t1 int' --声明执行语句内的参数,若是变量的话,只可以是Nvarchar变量
,@t2=@t1,@t1=88 --为语句内的参数赋值,左边是语句内的参数,右边是值。
/**************只输出一个参数*********************/
declare @sql Nvarchar(1000)
declare @tt2 int
exec sp_executesql
N'select @t2=200' --执行的语句,若是变量的话,只可以是Nvarchar变量
,N'@t2 int output' --声明执行语句内的参数,若是变量的话,只可以是Nvarchar变量
,@t2 = @tt2 output --外部变量接收输出output。
select @tt2/**********同时输入参数又输出参数************/
declare @sql Nvarchar(1000)
declare @tt int
declare @t1 int
set @t1=50;
exec sp_executesql
N'select @tt2=@t2+@t3' --执行的语句,若是变量的话,只可以是Nvarchar变量
,N'@t2 int,@t3 int,@tt2 int output' --为语句内的参数赋值,左边是语句内的参数,右边是值。
,@t2=@t1,@t3=50,@tt2=@tt output --语句内的参数赋值--左边是语句内的参数,右边是值。
--输出参数--声名外部的接收变量,因为有了输入参数,因此必须指明那个语句内变量为输出变量.
select @tt
ALTER proc [dbo].[proc_SwiftNumber_TaskFlow]
(
@tblName nvarchar(200), --表名
@colName nvarchar(200), --列名
@prefix nvarchar(100), --流水号的前缀
@length int, --流水号长度
@SwiftNumber varchar(100) output --流水号
)
as
begin
DECLARE @sql nvarchar(1000)
DECLARE @Con varchar(1000) set @Con=''
DECLARE @result varchar(100) set @result=''
set @sql='Select @Con=code from DocumentalInfo where datediff(d,'+@colName+'getdate())=0'
exec sp_executesql @sql,N'@con varchar(1000) output',@Con output
if @Con is null or @Con=''
begin
set @result=Convert(varchar(100),getdate(),112)+'01'
end
else
begin
Set @result=right(@Con,2)
set @result= Convert(varchar(100),getdate(),112)+@result+1
end
SELECT @SwiftNumber=@prefix +@result
end
查询数据表里面是否有当天添加(Convert(varchar(100),getdate(),112))的并且编号类型相同(@prefix)的数据。
如:Select @Con=code from DocumentalInfo where Convert(varchar(100),Code,112) like 'QJ'+'20100608'+'%' order by code
--用'QJ20100608%'去模糊查询!
忘记补充了
Code列在DocumentalInfo 表里面是存储的字符串,格式如下:QJ2010060801,QJ2010060802,KQGZ2010060801,etc