2008-10-15 7 views
2

J'ai donc besoin de mettre à jour un champ de texte. Ni l'instruction UPDATE ou le travail de WRITETEXT lorsqu'il est utilisé ci-dessousComment mettre à jour un champ texte ou ntext dans SQL Server 2000

CREATE TABLE MyTable (IDField int, MyField text) 
INSERT INTO MyTable (IDField) SELECT 1 

DECLARE @Data1 varchar(8000), @Data2 varchar(8000), @ptrval binary(16) 

SELECT @Data1 = REPLICATE('1',8000) 
SELECT @Data2 = REPLICATE('2',8000) 

-- this sets MyField to string of only 8000 characters 
UPDATE MyTable SET MyField = @Data1 + @Data2 WHERE IDField = 1 


SELECT @ptrval = TEXTPTR(MyField) 
FROM MyTable 
WHERE IDField = 1 

-- this causes an error: Incorrect syntax near '+'. 
--WRITETEXT MyTable.MyField @ptrval @Data1 + @Data2 

Comment suis-je censé faire quand les variables locales ne peuvent pas être de type texte? (Si je devais SSQL Server 2005 j'utiliser varchar (max) - mais je ne)

Répondre

5

Essayez d'utiliser à la place UPDATETEXT

WRITETEXT MyTable.MyField @ptrval @Data1 
UPDATETEXT MyTable.MyField @ptrval 8000 NULL @Data2 

L'insert de décalage est zéro TELLE MANIERE 8000 doit écrire dans le caractère 8001e . Le décalage de suppression est null car une valeur de NULL supprime toutes les données de la position insert_offset à la fin du texte existant.

Ref: http://msdn.microsoft.com/en-us/library/ms189466.aspx

Ne pas oublier nvarchar (que vous devez utiliser avec le champ ntext) ont une capacité maximale de la moitié des champs varchar que vous utilisez afin que vos tailles de blocs doivent être réduits à 4000 dans ce cas .

2

les valeurs varient effectivement en longueur, donc je vais essayer comme ça demain:

WRITETEXT MyTable.MyField @ptrval @Data1 
UPDATETEXT MyTable.MyField @ptrval Len(@Data1) NULL @Data2 

ci-dessus travaillé, mais je devais calculer la première longueur:

WRITETEXT MyTable.MyField @ptrval @Data1 
SET @Len = LEN(@Data1) 
UPDATETEXT MyTable.MyField @ptrval @Len NULL @Data2 

ne sais pas pourquoi vous ne peut pas utiliser une fonction comme LEN() où un paramètre est attendu.

0

J'ai eu du mal avec celui-ci. J'essayais de sauvegarder de longues chaînes de caractères (en fait, le contenu de la boîte de texte) dans un fichier ntext.

La solution s'est avérée être assez simple.

 SQLst = "UPDATE Test SET Text = cast (@value as ntext)" & _ 
      " WHERE Num = 3 " 

     Debug.Print(SQLst.ToString) 

     Dim cnn As New SqlServerCe.SqlCeConnection(Tcon) 
     Dim cmd = New SqlCeCommand(SQLst, cnn) 
     cmd.Parameters.AddWithValue("@value", strQuestionQUESTION) 
     cnn.Open() 
     cmd.ExecuteNonQuery() 
     cnn.Close() 

Note: strQuestionQUESTION était d'environ 3000 caractères ou code de formatage et du texte. "Num" est juste un champ entier dans la base de données "Test" qui contient également le nom de champ ntext "Texte"

Questions connexes