日期:2014-05-18  浏览次数:20716 次

写个存储过程,里面引号问题真头疼
想写个存储过程 使用bcp导出数据到文本文件 文件名是自动生成的 格式是OMPNUW.ARCHIVE001S.yyyymmdd.nn.txt
yyyymmdd是当天日期 需要用函数吧 其他是字符串 想用字符串拼接 但是不知道怎么写 存储过程不用细看 关键是生成指定格式文件名
alter proc [dbo].[up_OMP2NUW]  
as
begin
declare @sql varchar(500)

set @sql='bcp "select 记录标识=1,'+
's_appnumber 档案编号,'+
'所属机构=''商务公司'','+
'a.depotid 所属仓库编号,'+
'a.rackid 所属保管架编号,'+
'a.boxid 所属保管箱编号,'+
'(case b.boxstate when 4 then ''1'' else ''2'' end)档案类型,'+
'(case a.app_type when 0 then ''0'' else ''1'' end)档案类型2,'+
'状态=4,'+
'packagetime 归档时间'+
 ' from AppArchive.dbo.AppArch_App as a inner join AppArchive.dbo.AppArch_Box as b on a.boxid=b.boxid" queryout "c:\OMPNUW.ARCHIVE001S."+datepart(year,getdate())"+.00.txt" -c -T';
exec master..xp_cmdshell @sql
end

"c:\OMPNUW.ARCHIVE001S."+datepart(year,getdate())"+.00.txt" 这里是错误的 存储过程没问题 有些行是手动换行 行尾加了加号 有些行是自动换行 粘贴到这里 看不出来 所以说一下

------解决方案--------------------
SQL code

--加引号用quotename函数,这样不容易出错
declare @data int
set @data=256
select QUOTENAME(@data,'''')
--结果
/*
'256'
*/

------解决方案--------------------
''代表一个'的转义就可以了 注意点就可以了。
------解决方案--------------------
动态的里面 两个相当于非动态的一个

1--2
2--4 这样的
------解决方案--------------------
SQL code

ALTER proc [dbo].[up_OMP2NUW] 
as
begin
    declare @sql varchar(500)
    
    set @sql='bcp "select 记录标识=1,'+
    's_appnumber 档案编号,'+
    '所属机构=''商务公司'','+
    'a.depotid 所属仓库编号,'+
    'a.rackid 所属保管架编号,'+
    'a.boxid 所属保管箱编号,'+
    '(case b.boxstate when 4 then ''1'' else ''2'' end)档案类型,'+
    '(case a.app_type when 0 then ''0'' else ''1'' end)档案类型2,'+
    '状态=4,'+
    'packagetime 归档时间'+
 ' from AppArchive.dbo.AppArch_App as a 
 inner join AppArchive.dbo.AppArch_Box as b 
 on a.boxid=b.boxid" queryout "c:\OMPNUW.ARCHIVE001S."
 +''datepart(year,getdate())''+".00.txt" -c -T';
   print @sql 
   exec master..xp_cmdshell @sql
end
--打印出来的结果,楼主对着结果找错误的地方
/*

bcp "select 记录标识=1,s_appnumber 档案编号,所属机构='商务公司',a.depotid 所属仓库编号,a.rackid 所属保管架编号,a.boxid 所属保管箱编号,(case b.boxstate when 4 then '1' else '2' end)档案类型,(case a.app_type when 0 then '0' else '1' end)档案类型2,状态=4,packagetime 归档时间 from AppArchive.dbo.AppArch_App as a 
 inner join AppArchive.dbo.AppArch_Box as b 
 on a.boxid=b.boxid" queryout "c:\OMPNUW.ARCHIVE001S."
 +'datepart(year,getdate())'+".00.txt" -c -T
*/