【发布时间】:2014-09-23 18:48:07
【问题描述】:
我正在尝试使用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
我做错了什么?
【问题讨论】:
-
没有使用
substring将其切成小块,最好使用CLR 或OLE。从 nvarchar 转换为 varchar 也存在数据丢失问题。
标签: sql sql-server varchar xp-cmdshell