declare @dateup datetime ,@dateend datetime,@crmid int,@staffid int
declare @str1 varchar(64),@str2 varchar(64),@str3 varchar(64)
select @crmid=12,@staffid=1223
select @dateup = dbo.mintime_date (2007-12-20 )
select @dateend = dbo.maxtime_date(2007-12-20)
 if @crmid!=0 set @str1='and b.n_crm_id='''+@crmid+''''  else set @str1=''if @staffid!=0 set @str2='and b.n_provide_sellman= ''' +@staffid+''''  else set @str2=''Exec('select a.str_bill_no ,
a.n_crm_id,d.str_crm_name,
c.d_money,a.str_operate_code,
b.n_cost_type,
case b.n_cost_type when ''128'' then b.d_money end as 应收 ,
case b.n_cost_type when ''99'' then b.d_money end  as 现金还款
from t_account_stockintrade a
inner join dbo.t_receivables_account b
on a.str_bill_no=b.str_bill_no
inner join t_account_stockintrade_detail c
on a.n_stockaccount_id=c.n_stockaccount_id
inner join t_crm_customers d 
on a.n_crm_id=d.n_crm_id
where a.str_bill_no=b.str_src_bill_no
b.dt_chalkup between '''+@dateup+''' and '''+@dateend+''''+@str1+'''')

解决方案 »

  1.   


    动态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 
      

  2.   

    可以先在外边拼写一下 print看看有什么错!
      

  3.   

       怎么print啊?能说说吗?
      

  4.   

     declare @dateup datetime ,@dateend datetime,@crmid int,@staffid int
    declare @str1 varchar(64),@str2 varchar(64),@str3 varchar(64)
    select @crmid=12,@staffid=1223
    select @dateup = dbo.mintime_date (2007-12-20 )
    select @dateend = dbo.maxtime_date(2007-12-20)
    if @crmid!=0 set @str1=' and b.n_crm_id='''+cast(@crmid as varchar(10))+''''  else set @str1=''
    if @staffid!=0 set @str2=' and b.n_provide_sellman= ''' +cast(@staffid as varchar(10))+''''  else set @str2=''
    exec('select a.str_bill_no ,
    a.n_crm_id,d.str_crm_name,
    c.d_money,a.str_operate_code,
    b.n_cost_type,
    case b.n_cost_type when ''128'' then b.d_money end as 应收 ,
    case b.n_cost_type when ''99'' then b.d_money end  as 现金还款
    from t_account_stockintrade a
    inner join dbo.t_receivables_account b
    on a.str_bill_no=b.str_bill_no
    inner join t_account_stockintrade_detail c
    on a.n_stockaccount_id=c.n_stockaccount_id
    inner join t_crm_customers d 
    on a.n_crm_id=d.n_crm_id
    where a.str_bill_no=b.str_src_bill_no and
    b.dt_chalkup between '''+cast(@dateup as varchar(20))+''' and '''+cast(@dateend as varchar(20))+''''+@str1+'')
      

  5.   

    Exec('select a.str_bill_no ,
    a.n_crm_id,d.str_crm_name,
    c.d_money,a.str_operate_code,
    b.n_cost_type,
    case b.n_cost_type when ''128'' then b.d_money end as 应收 ,
    case b.n_cost_type when ''99'' then b.d_money end  as 现金还款
    from t_account_stockintrade a
    inner join dbo.t_receivables_account b
    on a.str_bill_no=b.str_bill_no
    inner join t_account_stockintrade_detail c
    on a.n_stockaccount_id=c.n_stockaccount_id
    inner join t_crm_customers d 
    on a.n_crm_id=d.n_crm_id
    where a.str_bill_no=b.str_src_bill_no
    b.dt_chalkup between '''+convert(char(19),@dateup,120)+''' and '''+convert(char(19),@dateend,120)+''''+@str1)
      

  6.   

    随便看看  你的出错了
        消息 102,级别 15,状态 1,第 22 行
    'cast' 附近有语法错误。
      

  7.   

     无枪狙击手 你的也不行啦
    消息 156,级别 15,状态 1,第 22 行
    关键字 'convert' 附近有语法错误。
      

  8.   

     declare @dateup datetime ,@dateend datetime,@crmid int,@staffid int
    declare @str1 varchar(64),@str2 varchar(64),@str3 varchar(64)
    select @crmid=12,@staffid=1223
    select @dateup = dbo.mintime_date ('2007-12-20')
    select @dateend = dbo.maxtime_date('2007-12-20')
    if @crmid!=0 set @str1=' and b.n_crm_id='''+cast(@crmid as varchar(10))+''''  else set @str1=''
    if @staffid!=0 set @str2=' and b.n_provide_sellman= ''' +cast(@staffid as varchar(10))+''''  else set @str2=''exec('select a.str_bill_no ,
    a.n_crm_id,d.str_crm_name,
    c.d_money,a.str_operate_code,
    b.n_cost_type,
    case b.n_cost_type when ''128'' then b.d_money end as 应收 ,
    case b.n_cost_type when ''99'' then b.d_money end  as 现金还款
    from t_account_stockintrade a
    inner join dbo.t_receivables_account b
    on a.str_bill_no=b.str_bill_no
    inner join t_account_stockintrade_detail c
    on a.n_stockaccount_id=c.n_stockaccount_id
    inner join t_crm_customers d 
    on a.n_crm_id=d.n_crm_id
    where a.str_bill_no=b.str_src_bill_no and
    b.dt_chalkup between '''+convert(varchar(19),@dateup,120)+''' and '''+convert(varchar(19),@dateend,120)+''''+@str1
    )怎么都是转换那的错?你是不是又自己改了哪了?
      

  9.   

      我把日期条件去掉结果可以 去掉了b.dt_chalkup between '''+convert(varchar(19),@dateup,120)+''' and '''+convert(varchar(19),@dateend,120)就可以正确执行
       
    declare @dateup datetime ,@dateend datetime,@crmid int,@staffid int
    declare @str1 varchar(64),@str2 varchar(64),@str3 varchar(64)
    select @crmid=12,@staffid=1223
    select @dateup = dbo.mintime_date (2007-12-20 )
    select @dateend = dbo.maxtime_date(2007-12-20)
    if @crmid!=0 set @str1=' and b.n_crm_id='''+cast(@crmid as varchar(10))+''''  else set @str1=''
    if @staffid!=0 set @str2=' and b.n_provide_sellman= ''' +cast(@staffid as varchar(10))+''''  else set @str2=''
    exec('select a.str_bill_no ,
    a.n_crm_id,d.str_crm_name,
    c.d_money,a.str_operate_code,
    b.n_cost_type,
    case b.n_cost_type when ''128'' then b.d_money end as 应收 ,
    case b.n_cost_type when ''99'' then b.d_money end  as 现金还款
    from t_account_stockintrade a
    inner join dbo.t_receivables_account b
    on a.str_bill_no=b.str_bill_no
    inner join t_account_stockintrade_detail c
    on a.n_stockaccount_id=c.n_stockaccount_id
    inner join t_crm_customers d 
    on a.n_crm_id=d.n_crm_id
    where a.str_bill_no=b.str_src_bill_no '+@str1+'')
      

  10.   

    不可能啊,我都测试过的,是不是你上面的函数有问题?
    select @dateup = dbo.mintime_date (2007-12-20 )
    select @dateend = dbo.maxtime_date(2007-12-20)
    不是给你加了''吗?怎么又没了,能直接传2007-12-20?
      

  11.   

    我的函数是自己写的,不是系统函数,函数没问题,他又没到exec里面去执行
      

  12.   

    顺便问一下,当我做SQL的UPDATE,INSERT操作后,我怎样才能确定操作是否成功,比如说我要修改一个记录的一个字段为12,可是他以前就是12,也就是说没有修改,但是修改语句还是能够顺利执行,我要怎么知道数据库修改了没有呢???