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+'''')
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+'''')
动态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
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+'')
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)
消息 102,级别 15,状态 1,第 22 行
'cast' 附近有语法错误。
消息 156,级别 15,状态 1,第 22 行
关键字 'convert' 附近有语法错误。
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
)怎么都是转换那的错?你是不是又自己改了哪了?
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+'')
select @dateup = dbo.mintime_date (2007-12-20 )
select @dateend = dbo.maxtime_date(2007-12-20)
不是给你加了''吗?怎么又没了,能直接传2007-12-20?