2010-05-07 2 views
0

Je publie cette question a un suivi de This question, car le thread ne reçoit pas plus de réponses.Passer d'énormes quantités de données en tant que paramètre hexadécimal (0x123AB ...) d'une procédure stockée clr dans le serveur SQL

J'essaie de comprendre s'il est possible de transmettre en tant que paramètre d'une procédure stockée CLR une grande quantité de données comme "0x5352532F ...". Cela permet d'éviter d'envoyer les données directement à la procédure stockée CLR, au lieu d'envoyer ti à un champ DB temporaire et de le passer en tant que varbinary (max) parmeter à la procédure stockée CLR.

J'ai une triple question:

1) est-il possible, si oui, comment? Disons que je veux passer un fichier pdf à la procédure stockée CLR (pas le chemin, les bits complets qui composent le fichier). Quelque chose comme:

exec MyCLRStoredProcs.dbo.insertfile 
@file_remote_path ='c:\temp\test_file.txt' , 
@file_contents=0x4D5A90000300000004000.... --(this long list is the file content) 

où InsertFile est une procédure stockée qui écrit sur le chemin du serveur (à file_remote_path) les données binaires comme je passe (file_contents). 2) Y a-t-il un risque de corruption d'adopter cette approche (ou c'est la même approche que SQL Server utilise en coulisse)?

3) comment convertir le contenu d'un fichier dans la représentation hexadécimale « 0x23423 ... »

Répondre

2

Quel est votre objectif? Essayez-vous de transférer un fichier du système de fichiers client vers le système de fichiers du serveur? Si c'est le cas, vous pouvez consulter un mécanisme de transfert de fichiers de service Web.

Voulez-vous conserver les données dans la base de données? Si c'est le cas, et que vous avez accès à SQL Server 2008, je vous recommande d'examiner le nouveau type FILESTREAM. Ce type maintient le lien entre la base de données et le système de fichiers pour vous. Si vous ne disposez pas de SQL Server 2008, vous pouvez également choisir de l'enregistrer en tant que fichier et de lui conserver un chemin d'accès de chaîne dans la base de données ou de stocker le contenu d'un fichier dans une colonne VARBINARY(MAX).

Si tout ce que vous voulez est d'obtenir les données dans la base de données, vous n'avez pas besoin d'un proc CLR. Vous pouvez l'enregistrer directement dans la base de données, ou vous pouvez coder un proc stocké SQL pour le faire.

En supposant que vous gardez l'approche d'envoyer à un proc CLR:

1) est-il possible, si oui, comment?

Bien sûr, pourquoi pas. Le code que vous avez écrit ressemble à un bon exemple. Le proc stocké devra convertir la chaîne en octets.

2) est là le risque de corruption d'adopter cette approche

Je ne sais pas ce que vous entendez ici. SQL Server remplacera-t-il de manière aléatoire les caractères de votre chaîne? Peut-être que vous avez accidentellement frappé une sorte de limite? Oui, peut-être; la taille maximale de NVARCHAR(MAX) est de 2^31-1, soit 2 147 483 647 caractères. Mais je doute que vous ayez un fichier PDF de cette taille. Perdez-vous le lien entre le fichier sur le disque et le chemin de la base de données? Oui, mais FILESTREAM devrait prendre soin de cela pour vous.

3) comment convertir le contenu d'un fichier dans la représentation hexadécimale « 0x23423 ... »

Il existe de nombreux exemples sur Internet sur la façon de le faire. En voici un:

How do you convert Byte Array to Hexadecimal String, and vice versa?

+0

Merci d'avoir pris le temps de me répondre avec une réponse si complète. Essayons de simuler FILESTREAM sans l'utiliser. J'ai besoin de cela parce que je dois aussi supporter 2005 et de plus j'ai plus de 300 clients et forcer tous à passer à 2008 et la configuration de FILESTREAM pour eux n'est pas une option pour moi. La procédure stockée CLR est nécessaire pour écrire sur le disque dur du serveur (je ne veux pas utiliser xp_cmdshell: plus de 300 utilisateurs, il n'y a pas plus de 300 gestionnaires informatiques qui aiment xp_cmdshell). Passer les octets directement au CLR m'évite l'utilisation d'une table temporaire. Merci pour le lien. Je vais essayer ça. – LaBracca

+0

Je voterais votre réponse mais ma réputation ne le permet pas actuellement. – LaBracca

+0

Maintenant, je peux .... Puissance de la réputation. Merci. – LaBracca

Questions connexes