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)
由于该表位于DBA
我DBA_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 的方式。
只是出于好奇,图像也会这样吗?
还有另一种类似于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)
您不能从文本输出中复制,因为它会截断数据。
您不能从网格输出中复制,不仅因为它会截断数据,而且还会破坏回车、换行和其他控制字符。
您可以将该列转换为 XML,然后双击以在新选项卡中查看数据。我在这里描述了这一点,但出于不同的目的:
基本上,SSMS 不是用来完成您想做的任务的。您可以提取到文件,但很可能在该过程中会发生类似的截断。
最好的办法是从 Powershell 或 C# 中提取数据并将其写入文件。
您应该能够使用我在以下答案中提供的存储过程(在 DBA.SE 上)来完成此任务:
由于您正在使用NVARCHAR(MAX)
,请参阅该答案底部的注释,其中包含指向NVARCHAR
PasteBin 上该存储过程版本的链接。
在任何一种情况下,存储过程都会以块的形式打印输出,以绕过 的 4000 或 8000 个字符限制(分别取决于NVARCHAR
或VARCHAR
)PRINT
,因此您不应该注意到任何截断,并且仍然应该得到换行符等按预期工作,从结果网格复制/粘贴时不会发生这种情况。
归档时间: |
|
查看次数: |
3699 次 |
最近记录: |