本帖最后由 puzhichen 于 2010-06-08 15:49:22 编辑

解决方案 »

  1.   

    我贴贴注释sp_executesql
    执行可以多次重用或动态生成的 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附加参数的值的占位符。这些值只能是常量或变量,而不能是更复杂的表达式,例如函数或使用运算符生成的表达式。
      

  2.   


    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
      

  3.   

    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
      

  4.   


    貌似我个人拙见跟楼上几位仁兄的意思有点相似,应该没理解错误。
    那请大家看看我下面这么写有说明问题吗?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)
      

  5.   

    Select @Con=code from DocumentalInfo where Convert(varchar(100),@colName,112) like ''+@prefix+Convert(varchar(100),getdate(),112)+'%' order by code 
    这个不会报错吗??
      

  6.   

    你这不需要那么做吧这样就可以
    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
      

  7.   

    Select @Con=code from DocumentalInfo where Convert(varchar(100),@colName,112) like ''+@prefix+Convert(varchar(100),getdate(),112)+'%' order by code 这句是有问题,应该动态执行,
    不过你要先解释一下,怎么回事
      

  8.   


    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
      

  9.   

    参考,读懂了就通了:http://blog.csdn.net/htl258/archive/2009/04/25/4106390.aspx
      

  10.   

    这样改一下试试
    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
      

  11.   

    恩,不会报错,真个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%'去模糊查询!
      

  12.   

    这个好像有问题,提示Codegetdate不是内置函数
    忘记补充了
    Code列在DocumentalInfo 表里面是存储的字符串,格式如下:QJ2010060801,QJ2010060802,KQGZ2010060801,etc