sql server xp_cmdshell echo NVARCHAR(MAX)string

时间:2014-09-23 18:48:08

标签: sql sql-server varchar xp-cmdshell

我正在尝试使用master.sys.xp_cmdshell来回显一个非常大的字符串。我认为varchar的最大值我认为是大约8000个字符的东西太小所以我不知道如何实现这个,因为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

我做错了什么?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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