1

我试图用来master.sys.xp_cmdshell回显一个非常大的字符串。我相信我认为大约 8000 个字符的最大值varchar太小了,所以我不确定如何实现这一点,因为 xp_cmdshell 期望字符串是 varchar。

我的@MESSAGE变量被声明为NVARCHAR(MAX),我需要它的每一点。这是我的代码:

DECLARE @EXECUTION_STRING NVARCHAR(MAX) = 'ECHO ' + @MESSAGE + ' > "' + @FULL_PATH + '\' + @FILE_NAME + '"'
EXEC master.sys.xp_cmdshell @EXECUTION_STRING 

所以,我的问题是;当字符串是类型时,如何完成字符串到文件写入NVARCHAR(MAX)


新计划,基于@Arun 的建议,即创建具有 BCP 功能的 SP。到目前为止,这是我的代码:

DECLARE @THCIC_OUTPUT_TABLE             VARCHAR(255) = '##temp' + CONVERT(VARCHAR(12), CONVERT(INT, RAND() * 1000000))
DECLARE @RESULT                         INTEGER
DECLARE @THCIC_OUTPUT_EXECUTION_COMMAND NVARCHAR(MAX) = ' 
                                                        CREATE TABLE [' + @THCIC_OUTPUT_TABLE + '] ( CONTENT NVARCHAR(MAX) )

                                                        INSERT INTO [' + @THCIC_OUTPUT_TABLE + ']
                                                            SELECT @MESSAGE
                                                      '

EXECUTE SP_EXECUTESQL @THCIC_OUTPUT_EXECUTION_COMMAND, N'@MESSAGE NVARCHAR(MAX)', @MESSAGE

DECLARE @THCIC_OUTPUT_FILE_WRITE_COMMAND VARCHAR(1000) = '
                                                          BCP ”SELECT CONTENT FROM [' + @THCIC_OUTPUT_TABLE + ']"
                                                          QUERYOUT "' + @FULL_PATH + '\' + @FILE_NAME + '" -w -T -S ' + @@servername 

PRINT @THCIC_OUTPUT_FILE_WRITE_COMMAND

EXECUTE @RESULT = master.sys.xp_cmdshell @THCIC_OUTPUT_FILE_WRITE_COMMAND, NO_OUTPUT
PRINT @RESULT
EXECUTE ( 'DROP TABLE [' + @THCIC_OUTPUT_TABLE + ']' )

所以,令人沮丧的部分是我收到一个错误,但我的文件没有被写入。的输出PRINT @THCIC_OUTPUT_FILE_WRITE_COMMAND是:

BCP ”SELECT CONTENT FROM [##temp878274]"
QUERYOUT "\\TXPDC-FS01\Profiles\cofarmer\My Sandbox\THCIC\Q2_2014\Burleson\PIPSUB2938718184092014251607.txt" -w -T -S TXPDC-STKSQL01

而输出PRINT @RESULT是:1

我究竟做错了什么?

4

2 回答 2

2

如果您可以将消息分成两半,那么您可以将第一部分输出到新文件,然后将后半部分附加到该文件中。

DECLARE @EXECUTION_STRING1 NVARCHAR(MAX) = 'ECHO ' + @MESSAGE1 + ' > "' + @FULL_PATH + '\' + @FILE_NAME + '"'
DECLARE @EXECUTION_STRING2 NVARCHAR(MAX) = 'ECHO ' + @MESSAGE2 + ' >> "' + @FULL_PATH + '\' + @FILE_NAME + '"'
EXEC master.sys.xp_cmdshell @EXECUTION_STRING1
EXEC master.sys.xp_cmdshell @EXECUTION_STRING2

这将在两半之间放置一个换行符,这可能会或可能不会很好地适合您需要做的事情,具体取决于是否有自然的换行符位置。

有关重定向的更多信息 http://technet.microsoft.com/en-gb/library/bb490982.aspx

于 2014-09-23T19:52:43.827 回答
2

你不能在 xp_cmdshell 上,因为 windows xp 命令行字符串限制是 8,000 多一点。你最好为 bcp 创建另一个存储过程。

于 2014-09-23T19:19:59.770 回答