sql server 的存储过程字符串怎么拼接的?

京城金 2011-09-14 03:16:52


set @sql='set nocount on select ''insert '+@tablename+'('+@column+') values(''as ''--'','+@columndata+','')'' from '+@tablename

EXEC master..xp_cmdshell 'bcp '+ @sql+' queryout "C:\rover.txt" -T -t -c -S .\sqlexpress -d administratorddbb'



EXEC master..xp_cmdshell 这行,编译器总告诉我'bcp '+ @sql 中间那个加号编译错误,这为什么呀
...全文
679 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiangaylian 2011-09-15
  • 打赏
  • 举报
回复
把拼接的字符串用括号括起来试下。。
-晴天 2011-09-14
  • 打赏
  • 举报
回复
把你的exec 改成 print ,看看语句到底是什么样的,或许可以直接看出里面有什么问题.
京城金 2011-09-14
  • 打赏
  • 举报
回复
全部代码

USE [administratorddbb]
GO
/****** Object: StoredProcedure [dbo].[ExportData] Script Date: 09/14/2011 18:54:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ExportData]
@tablename sysname
AS
declare @column varchar(1000)
declare @columndata varchar(1000)
declare @sql varchar(4000)
declare @xtype tinyint
declare @name sysname
declare @objectId int
declare @objectname sysname
declare @ident int
declare @str varchar(4000)

set nocount on
set @objectId=object_id(@tablename)

if @objectId is null -- 判断对象是否存在
begin
print 'The object not exists'
return
end
set @objectname=rtrim(object_name(@objectId))

if @objectname is null or charindex(@objectname,@tablename)=0 --此判断不严密
begin
print 'object not in current database'
return
end

if OBJECTPROPERTY(@objectId,'IsTable') < > 1 -- 判断对象是否是table
begin
print 'The object is not table'
return
end

select @ident=status&0x80 from syscolumns where id=@objectid and status&0x80=0x80

if @ident is not null
print 'SET IDENTITY_INSERT '+@TableName+' ON'

declare syscolumns_cursor cursor

for select c.name,c.xtype from syscolumns c where c.id=@objectid order by c.colid

open syscolumns_cursor
set @column=''
set @columndata=''
fetch next from syscolumns_cursor into @name,@xtype

while @@fetch_status < >-1
begin
if @@fetch_status < >-2
begin
if @xtype not in(189,34,35,99,98) --timestamp不需处理,image,text,ntext,sql_variant 暂时不处理

begin
set @column=@column+case when len(@column)=0 then'' else ','end+@name

set @columndata=@columndata+case when len(@columndata)=0 then '' else ','','','
end

+case when @xtype in(167,175) then '''''''''+'+@name+'+''''''''' --varchar,char
when @xtype in(231,239) then '''N''''''+'+@name+'+''''''''' --nvarchar,nchar
when @xtype=61 then '''''''''+convert(char(23),'+@name+',121)+''''''''' --datetime
when @xtype=58 then '''''''''+convert(char(16),'+@name+',120)+''''''''' --smalldatetime
when @xtype=36 then '''''''''+convert(char(36),'+@name+')+''''''''' --uniqueidentifier
else @name end

end

end

fetch next from syscolumns_cursor into @name,@xtype

end

close syscolumns_cursor
deallocate syscolumns_cursor

set @sql='set nocount on select ''insert '+@tablename+'('+@column+') values(''as ''--'','+@columndata+','')'' from '+@tablename

/*EXEC master..xp_cmdshell 'bcp '+@sql+' queryout "C:\bcptest.txt" -T -t -c -S .\sqlexpress -d administratorddbb'*/
print '--'+@sql

set @str='bcp '+ @sql+' queryout "C:\rover.txt" -T -t -c -S .\sqlexpress -d administratorddbb'

EXEC master..xp_cmdshell @str

exec(@sql)

if @ident is not null
print 'SET IDENTITY_INSERT '+@TableName+' OFF'




京城金 2011-09-14
  • 打赏
  • 举报
回复
兄弟们,为什么说复制方法必须是in out或format 啊
--小F-- 2011-09-14
  • 打赏
  • 举报
回复
set @sql='set nocount on select ''insert '+@tablename+'('+@column+') values(''as ''--'','+@columndata+','')'' from '+@tablename 
set @str='bcp '+ @sql+' queryout "C:\rover.txt" -T -t -c -S .\sqlexpress -d administratorddbb'
EXEC master..xp_cmdshell @str
快溜 2011-09-14
  • 打赏
  • 举报
回复
declare @str varchar(1000)

set @sql='set nocount on select ''insert '+@tablename+'('+@column+') values(''as ''--'','+@columndata+','')'' from '+@tablename
set @str='bcp '+ @sql+' queryout "C:\rover.txt" -T -t -c -S .\sqlexpress -d administratorddbb'
EXEC master..xp_cmdshell @str

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧