Sql server bcp输出的问题

Sql server bcp输出的问题,sql-server,tsql,bcp,Sql Server,Tsql,Bcp,我对以下代码有一些问题。此代码的主要原因是将SQL语句导出到文件中。但它不起作用,我也看不出我的错误 DECLARE @DBName VARCHAR(5000); DECLARE @period VARCHAR(5000); DECLARE @SQLEXE VARCHAR(5000); DECLARE @SearchSchema VARCHAR(5000); SET @period = '''2017-01-01 00:00:00'' AND ''2017-12-31 23:59:59'''

我对以下代码有一些问题。此代码的主要原因是将SQL语句导出到文件中。但它不起作用,我也看不出我的错误

DECLARE @DBName VARCHAR(5000);
DECLARE @period VARCHAR(5000);
DECLARE @SQLEXE VARCHAR(5000);
DECLARE @SearchSchema VARCHAR(5000);

SET @period = '''2017-01-01 00:00:00'' AND ''2017-12-31 23:59:59'''


SET @DBName = (SELECT name FROM master.dbo.sysdatabases where name LIKE '%NAV%');
EXECUTE ('USE [' + @DBName+']');

SET @SearchSchema  =  REPLACE((SELECT name FROM sys.tables where name LIKE '%$Change Log Setup'), 'Change Log Setup', 'Change Log Entry');
SET @SQLEXE = 'bcp "SELECT [Entry No_]
      ,[Date and Time]
      ,[User ID]
      ,[Table No_]
      ,[Field No_]
      ,[Type of Change]
      ,[Old Value]
      ,[New Value]
      ,[Primary Key]
      ,[Primary Key Field 1 No_]
      ,[Primary Key Field 1 Value]
      ,[Primary Key Field 2 Value]
      ,[Primary Key Field 3 No_]
      ,[Primary Key Field 3 Value]
      ,[Record ID]
  FROM [dbo].[' + @SearchSchema + ']
  WHERE [Date and Time] BETWEEN '+@period+'" out "C:\Users\Public\Documents\1a_EY_change_log_entry.txt" -o "C:\Users\Public\Documents\1b_EYlog_change_log_entry.log" -c -T';
Exec master..xp_cmdshell @SQLEXE;
错误消息是:


你看到我的错误了吗?

在尝试执行之前,你应该打印得到的命令:print@SQLEXE

您至少有1个逻辑错误:当执行“USE['+@DBName+']”时;它仅在动态代码的这段时间内更改db上下文

因此,如果您尝试这样做:执行“USE['+@DBName+']”;选择数据库名称 您将看到您仍然在数据库中,而不是在@DBName上下文中

那么您的@SearchSchema可能仍然为空,这意味着@SQLEXE也将变为空

但是,如果您的输出是基本bcp用法语法,那么您的命令可能不是null,而是包含只有您在执行print@SQLEXE;时才能看到的任何其他错误

例如,您可能在用户默认数据库的上下文中执行代码,该数据库可能是主数据库,因为您没有在代码中输入dbname:select..from[dbo].['+@SearchSchema+'],但如果您不精确定义数据库,它将是用户的默认数据库


因此,在这里发布打印输出,以便我们可以更精确地帮助您

这可能很奇怪,但它会起作用

将整个sql放在一行而不是新行中

SET @SQLEXE = 'bcp "SELECT [Entry No_],[Date and Time],[User ID],[Table No_],[Field No_],[Type of Change],[Old Value],[New Value],[Primary Key],[Primary Key Field 1 No_],[Primary Key Field 1 Value],[Primary Key Field 2 Value],[Primary Key Field 3 No_],[Primary Key Field 3 Value],[Record ID] FROM [dbo].[' + @SearchSchema + '] WHERE [Date and Time] BETWEEN '+@period+'" out "C:\Users\Public\Documents\1a_EY_change_log_entry.txt" -o "C:\Users\Public\Documents\1b_EYlog_change_log_entry.log" -d '+quotename(@dname)+' -c -T';
此外,这也不会像您预期的那样起作用

EXECUTE ('USE [' + @DBName+']');
使用bcp中的数据库参数-d选项


您需要使用queryyout,而不是out,因为您试图从查询中获取数据,而不是从视图或表中获取数据。这是一件事。我仍然不确定-o。结果现在是:没有列名主控输出空打印命令:Print'Show:'+@SQLEXE;没有显示任何内容。>>>>结果现在是:没有列名主控>>>打印'show:'+@SQLEXE;在设置@SearchSchema之后,不显示任何内容:set@SearchSchema=REPLACESELECT name FROM sys.tables,其中的名称类似“%$Change Log Setup”、“Change Log Setup”、“Change Log Entry”;执行以下选择:select@SearchSchema,我认为它是空的结果现在是:没有列名主控输出空打印命令:Print'Show:'+@SQLEXE;什么也看不出来。
-d databasename