web-dev-qa-db-fra.com

Comment récupérer un gros texte de l'intérieur d'une table?

pour mes propres disques, j'ai une table dans l'un de mes serveurs où j'aime enregistrer mes activités et mes scripts

la définition de la table est:

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)

comme cette table est située dans la base de données DBA sur mon DBA_SERVER serveur, de ma machine locale j'ai créé un linked server à la DBA_SERVER Pour que je puisse insérer des scripts dans ma table.

voici comment j'insérez un script dans ma table, le script est situé sur ma machine locale:

    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]

et cela semble fonctionner correctement, car lorsque j'exécute la sélection ci-dessous:

SELECT [dt]
      ,[i]
      ,[activity]
      ,[script]
  FROM [MY_DBA_SERVER].[DBA].[dbo].[activity]
GO

Je peux voir que les choses que j'ai juste insérées sont sur ma table. enter image description here

et quand j'exécute le script suivant, je découvre la quantité de données dans chaque champ:

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

et cela me donne ceci:

enter image description here

Mon problème est que je ne peux pas récupérer tout le contenu de mon script. J'ai essayé de le copier à l'aide de la souris comme vous pouvez le voir sur l'image ci-dessous:

enter image description here

Mais j'ai des scripts velus très longs et la copie comme celle qui les coupe de tout son ensemble.

ma question est:

Comment récupérer ce script de ma table?

il peut être via Sélectionner ou même la sauver dans un fichier, je préférerais une manière T-SQL de le faire si possible.

Juste une curiosité serait-elle la même chose pour les images?

3

Vous devriez pouvoir accomplir cela avec la procédure stockée que j'ai fournie dans la réponse suivante (ici sur dba.se):

Comment générer plus de 4000 caractères dans SQLCMD

Puisque vous utilisez NVARCHAR(MAX), veuillez consulter la note vers le bas de cette réponse qui a un lien avec la version NVARCHAR de cette procédure stockée sur Pastebin.

Dans les deux cas, les procédures stockées impriment la sortie en morceaux pour se déplacer autour de la limitation de 4000 ou 8 000 caractères (selon NVARCHAR ou VARCHAR, respectivement) de PRINT, d'où vous ne devrait remarquer aucune troncature et , vous devez toujours obtenir de nouvelles lignes, etc., fonctionner comme prévu, ce qui ne se produira pas lors de la copie/colle de la grille de résultats.

2
Solomon Rutzky

Vous ne pouvez pas copier de la sortie de texte, car il tronque les données.

Vous ne pouvez pas copier de la sortie de la grille, non seulement parce qu'il tronque les données, mais elle mangue également des retours de chariot, des flux de lignes et d'autres caractères de contrôle.

Vous pourrait être capable de convertir cette colonne en XML, puis double-cliquez pour afficher les données dans un nouvel onglet. Je décris cela ici, mais pour un but différent:

Fondamentalement, SSMS n'a pas été faite pour faire la tâche que vous souhaitez faire. Vous pouvez extraire dans un fichier, mais il est fort probable que la troncature similaire se produise pendant ce processus.

Votre meilleur pari est de tirer les données de PowerShell ou C # et de faire cela écrire la sortie dans un fichier.

3
Aaron Bertrand

Il y a une autre façon similaire à Aaron, en utilisant le petit documenté processing-instruction... chose.

L'utilisation de cela vous donne une cochèque XML, qui ne remplacera pas les entités prédéfinies.

En outre, la colonne aura des marques d'identification XML au début et à la fin, ce qui peut être un autre inconvénient en fonction de la manière dont vous souhaitez utiliser la sortie.

Mais ça va être clicky et vous montrer tout le monde!

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
2
Erik Darling