Sql server bcp输出的问题
我对以下代码有一些问题。此代码的主要原因是将SQL语句导出到文件中。但它不起作用,我也看不出我的错误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'''
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