我创建了一个proc,它可以抓取我机器上本地数据库中的所有用户表。我希望能够使用BCP和SQL创建所有表的平面文件。它是SQL 2000中的虚拟数据库,通过Windows身份验证连接。我在WinXP SP2中设置了我的环境路径变量。我创建了新用户来访问数据库,关闭我的防火墙,使用可信连接。我试过几十个论坛,没有运气。
在dos命令提示符下,我得到了同样的错误。
SQLState = 37000,NativeError = 4060 错误= [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]无法打开登录'[HelpDesk-EasyPay']中请求的数据库。登录失败。
这是我的SP:
@Path VARCHAR(100),
@UserName VARCHAR(15),
@PassWord VARCHAR(15),
@ServerName VARCHAR(15)
AS
set quoted_identifier off
set nocount on
declare @n int
declare @db varchar(40)
set @db=DB_NAME()
declare @TableName varchar(15)
declare @bcp varchar(200)
select identity(int,1,1) as tblNo,name tblname into #T from Sysobjects where xtype='u'
select @n=COUNT(*) from #T
WHILE (@n>0)
BEGIN
SELECT @TableName=tblname FROM #T WHERE tblno=@n
PRINT 'Now BCP out for table: ' + @TableName
SET @bcp = "master..xp_cmdshell 'BCP " + "[" + @db + ".." + @TableName + "]" + " OUT" + @Path + "" + @TableName+".txt -c -U" + @UserName + " -P" + @PassWord + " -S" + @ServerName + " -T" + "'"
EXEC(@bcp)
SET @n=@n-1
END
DROP TABLE #T
任何人都可以提供建议。这似乎是一个连接问题或BCP?不确定。
编辑:我从查询分析器运行它,因为我有118个表输出到平面文件。我似乎同意它的身份验证问题,因为我尝试使用用户名sa密码root连接到master db。这是它的设置,我得到相同的错误:SQLState = 37000,NativeError = 4060
提前感谢你。 EJ
答案 0 :(得分:1)
您的括号扩展到整个限定表名称 - 只有各个组件应该放在括号中:
bcp [HelpDesk-EasyPay].dbo.[customer] out d:\MSSQL\Data\customer.bcp -N -Utest -Ptest -T
应该有效,所以你想要:
SET @bcp = "master..xp_cmdshell 'BCP " + "[" + @db + "]..[" + @TableName + "]" + " OUT" + @Path + "" + @TableName+".txt -c -U" + @UserName + " -P" + @PassWord + " -S" + @ServerName + " -T" + "'"
你的代码中的。看起来你给出的错误信息被截断,否则你本来可以看到它试图打开数据库“[HelpDesk-EasyPay.dbo.customer]”当然不存在,即使它没过,你会得到一个没有指定表格的错误。
答案 1 :(得分:0)
我对OUT有同样的问题(减去字符杀死所有事件^不起作用)
我用QUERYOUT来避免它。像这样:
SET @s = 'BCP "SELECT * FROM [HelpDesk-EasyPay].dbo.customers" QUERYOUT myfile.txt ...'
答案 2 :(得分:0)
也许有人会派上用场:SQL Server 2017也有同样的问题。原因是数据库名称的方括号。