1

master.sys.xp_cmdshell非常に大きな文字列をエコーするために使用しようとしています。xp_cmdshell は文字列が varchar であると想定しているため、最大でvarchar約 8000 文字と考えられるのは小さすぎるため、これを達成する方法がわかりません。

私の@MESSAGE変数は次のように宣言されてNVARCHAR(MAX)おり、そのすべてが必要です。これが私のコードです:

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

だから、私の質問は; 文字列のタイプが の場合、文字列からファイルへの書き込みを行うにはどうすればよいNVARCHAR(MAX)ですか?


BCP機能を備えたSPを作成するという@Arunの提案に基づく新しい計画。これまでの私のコードは次のとおりです。

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

メッセージを 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

これにより、2 つの半分の間に改行が配置されます。これは、改行の自然な場所があるかどうかに応じて、必要なものにうまく適合する場合と適合しない場合があります。

リダイレクトの詳細については http://technet.microsoft.com/en-gb/library/bb490982.aspx

于 2014-09-23T19:52:43.827 に答える