2

我创建了一个 proc 来获取我机器上本地数据库中的所有用户表。我希望能够使用 BCP 和 SQL 创建我所有表的平面文件。它是通过 Windows 身份验证连接的 SQL 2000 中的虚拟数据库。我在 WinXP SP2 中设置了我的环境路径变量。我创建了新用户来访问数据库,关闭了我的防火墙,使用受信任的连接。我已经尝试了几十个论坛,没有运气。

在 dos 命令提示符下,我得到了同样的错误。

SQLState = 37000,NativeError = 4060 错误 = [Microsoft][ODBC SQL Server Driver][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 连接到主数据库。这是它的设置,我得到同样的错误: SQLState = 37000, NativeError = 4060

4

3 回答 3

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]”,当然,它不存在,即使它这样做,你会得到一个没有指定表的错误。

于 2008-11-07T13:43:25.163 回答
0

我对 OUT 有同样的问题(减号字符会杀死所有事件 ^ 不起作用)

我用QUERYOUT避免它。像这样 :

SET  @s = 'BCP "SELECT * FROM [HelpDesk-EasyPay].dbo.customers" QUERYOUT myfile.txt ...'
于 2009-10-23T13:39:46.550 回答
0

也许有人会派上用场:我对 SQL Server 2017 也有同样的问题。原因是数据库名称周围的方括号。

于 2020-07-10T09:23:04.223 回答