2011-12-14 3 views
3

J'utilise Microsoft Sql Server 2008. J'utilise une vue (dbo.building_piclink) pour obtenir des noms de photo (@imgName) et insérer les photos dans une table à partir d'un fichier. Je dois prendre aussi ce nom photo et l'ajouter dans une colonne appelée att_name mais je ne peux pas comprendre la syntaxe de l'instruction d'insertion pour l'ajouter dans.Insérer dans SQL Server avec la variable

DECLARE @imgString varchar(800) 
DECLARE @insertString varchar(3000) 
DECLARE @imgNumber int 
Declare @imgName varchar(100) 

SET @imgNumber = 1 

WHILE @imgNumber <> 10 

BEGIN 

SELECT @imgName = Lower(items) FROM dbo.building_piclink 

SET @imgString = 'C:\Documents and Settings\Administrator\Desktop\photos\' + @imgName 


SET @insertString = 'INSERT INTO dbo._building__ATTACH (DATA) 
SELECT * FROM OPENROWSET(BULK N''' + @imgString + ''', SINGLE_BLOB) as tempImg' 

Print @insertString 

SET @imgNumber = @imgNumber + 1 

EXEC(@insertString) 

END 

GO 

J'ai essayé

SET @insertString = 'INSERT INTO dbo._building__ATTACH (DATA, ATTNAME) 
SELECT * FROM OPENROWSET(BULK N''' + @imgString + ''', SINGLE_BLOB) as tempImg,' + @imgName 

mais je reçois une erreur comme ceci:

Msg 208, niveau 16, état 1, ligne 1 nom d'objet incorrect 'de b26382_3_775682.jpg'

J'ai essayé juste faire l'insert sur la att_name:

SET @insertString = 'INSERT INTO dbo._buildingpoint__ATTACH (ATT_NAME)' + @imgName 

sans chance. Il me manque quelque chose dans la syntaxe.

Merci!

+1

Je suggère de simplifier légèrement pour aider à isoler le problème. Est-ce que la requête 'SELECT * FROM OPENROWSET' ... fonctionne si vous l'exécutez de manière isolée? –

Répondre

1

Eh bien, oui, votre chaîne d'insertion n'est pas correct - en ce moment, vous obtenez quelque chose comme:

INSERT INTO dbo._building__ATTACH (DATA, ATTNAME) 
    SELECT * 
    FROM OPENROWSET(BULK N'b26382_3_775682.jpg', SINGLE_BLOB) as tempImg, b26382_3_775682.jpg 

alors que si vous souhaitez insérer le nom du fichier en tant que chaîne, vous devez le mettre en single citations (et je voudrais aussi inverser l'ordre de la colonne dans le INSERT):

INSERT INTO dbo._building__ATTACH (ATTNAME, DATA) 
    SELECT 
     'b26382_3_775682.jpg', tempImg.* 
    FROM 
     OPENROWSET(BULK N'b26382_3_775682.jpg', SINGLE_BLOB) as tempImg 

en outre, comme Jon of All Trades suggéré: pouvez-vous essayer seulement de lancer cette déclaration INSERT isolément, juste pour voir si cela déclaration sur son propre fonctionne correctement? Une fois que cela fonctionne - alors l'intégrer dans votre proc stocké et le transformer en une instruction SQL dynamique ...

Mise à jour: oui - comme je l'ai dit dans ma réponse (quelques lignes d'ici): vous devez mettre le nom de fichier que vous souhaitez insérer dans attName dans des guillemets simples - vos commentaires ne fonctionne toujours pas que faire ....

Essayez ceci:

SET @insertString = 
    'INSERT INTO dbo._building__ATTACH (ATTNAME, DATA) ' + 
    'SELECT ''' + @imgName + ''', tempImg.* ' + 
    'FROM OPENROWSET(BULK N''' + @imgString + ''', SINGLE_BLOB) as tempImg' 

ce travail?

Questions connexes