如何从表格中检索大文本?

Mar*_*lli 6 sql-server blob openrowset sql-server-2016 bulk-insert

为了我自己的记录,我在其中一台服务器上有一张表,我喜欢在其中保存我的活动和脚本

表定义是:

IF OBJECT_ID('[dbo].[activity]') IS NOT NULL 
DROP TABLE [dbo].[activity] 
GO
CREATE TABLE [dbo].[activity] ( 
[dt]        DATE                             NOT NULL,
[i]         SMALLINT                         NOT NULL,
[activity]  NVARCHAR(max)                     NOT NULL,
[script]    NVARCHAR(max)                     NULL  
           CONSTRAINT [DF__activity__script__6E01572D] DEFAULT (NULL))

GO
CREATE CLUSTERED INDEX [pk_activity] 
   ON [dbo].[activity] ([dt] desc, [i] desc)
Run Code Online (Sandbox Code Playgroud)

由于该表位于DBADBA_SERVER服务器上的数据库中,因此我从本地计算机创建了一个linked server到该表,DBA_SERVER以便我可以将脚本插入到我的表中。

这就是我将脚本插入我的表的方式,该脚本位于我的本地机器上:

    INSERT INTO [MY_DBA_SERVER].[DBA].[dbo].[activity]
               ([dt]
               ,[i]
               ,[activity]
               ,[script])
    SELECT
               DT=cast ('3 may 2018' as date)
               ,I=1100
               ,ACTIVITY='MOVE APPLICATION ROWS - the Ids work'
               ,[script]=BulkColumn 
    FROM Openrowset( Bulk 'C:\Users\MMiorelli\Downloads\applicationID consolidated.sql', 
                     Single_Blob) as [the script]
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,因为当我运行下面的选择时:

SELECT [dt]
      ,[i]
      ,[activity]
      ,[script]
  FROM [MY_DBA_SERVER].[DBA].[dbo].[activity]
GO
Run Code Online (Sandbox Code Playgroud)

我可以看到我刚刚插入的东西在我的桌子上。 在此处输入图片说明

当我运行以下脚本时,我会发现每个字段中有多少数据:

SELECT [dt]
      ,[i]
      ,[activity]
      ,[script]
      ,len_activity=DATALENGTH( [activity])
      ,len_script=DATALENGTH( [script])
  FROM [MY_DBA_SERVER].[DBA].[dbo].[activity]
GO
Run Code Online (Sandbox Code Playgroud)

这给了我这个:

在此处输入图片说明

我的问题是我无法检索脚本的全部内容。我尝试使用鼠标复制它,如下图所示:

在此处输入图片说明

但是我有一些很长的毛茸茸的脚本,像这样复制会使它们变得不完整。

我的问题是:

如何script从我的表中检索这个?

它可以通过选择或什至将其保存到文件中,如果可能的话,我更喜欢使用 T-SQL 的方式。

只是出于好奇,图像也会这样吗?

Eri*_*ing 7

还有另一种类似于Aaron 的方法,使用记录很少的processing-instruction... 东西。

使用它可以为您提供未经检查的 XML,它不会替换预定义的实体。

此外,该列的开头和结尾都有 XML 标识标记,这可能是另一个缺点,具体取决于您希望如何使用输出。

但它会发出咔哒声,并向您展示整件事!

CREATE TABLE dbo.LongText ( 
    Id INT IDENTITY, 
    LongText_N NVARCHAR(MAX), 
    LongText_X XML  
    );

INSERT dbo.LongText ( LongText_N, LongText_X )
SELECT asm.definition, (SELECT asm.definition AS [processing-instruction(_)] FOR XML PATH(''))
FROM sys.all_sql_modules AS asm

SELECT * FROM dbo.LongText AS lt
Run Code Online (Sandbox Code Playgroud)


Aar*_*and 6

您不能从文本输出中复制,因为它会截断数据。

您不能从网格输出中复制,不仅因为它会截断数据,而且还会破坏回车、换行和其他控制字符。

可以将该列转换为 XML,然后双击以在新选项卡中查看数据。我在这里描述了这一点,但出于不同的目的:

基本上,SSMS 不是用来完成您想做的任务的。您可以提取到文件,但很可能在该过程中会发生类似的截断。

最好的办法是从 Powershell 或 C# 中提取数据并将其写入文件。


Sol*_*zky 4

您应该能够使用我在以下答案中提供的存储过程(在 DBA.SE 上)来完成此任务:

如何在sqlcmd中输出超过4000个字符

由于您正在使用NVARCHAR(MAX),请参阅该答案底部的注释,其中包含指向NVARCHARPasteBin 上该存储过程版本的链接。

在任何一种情况下,存储过程都会以块的形式打印输出,以绕过 的 4000 或 8000 个字符限制(分别取决于NVARCHARVARCHARPRINT,因此您不应该注意到任何截断,并且仍然应该得到换行符等按预期工作,从结果网格复制/粘贴时不会发生这种情况。