Cómo actualizar un campo de texto o ntext en SQL Server 2000
-
03-07-2019 - |
Pregunta
Entonces necesito actualizar un campo de texto. Ni la instrucción UPDATE ni la instrucción WRITETEXT funcionan cuando se usan a continuación
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
¿Cómo se supone que debo hacer esto cuando las variables locales no pueden ser de tipo TEXT? (Si tuviera SSQL Server 2005 usaría varchar (max), pero no lo tengo)
Solución
Intente usar UPDATETEXT en su lugar
WRITETEXT MyTable.MyField @ptrval @Data1
UPDATETEXT MyTable.MyField @ptrval 8000 NULL @Data2
El desplazamiento de inserción está basado en cero, por lo que 8000 debería escribir en el carácter 8001. El desplazamiento de eliminación es nulo ya que un valor de NULL elimina todos los datos de la posición insert_offset al final del texto existente.
Ref: http://msdn.microsoft.com/en-us/ library / ms189466.aspx
No olvide que nvarchar (que debe usar con el campo ntext) tiene una capacidad máxima de la mitad de los campos varchar que está utilizando, por lo que sus tamaños de bloque deben reducirse a 4000 en ese caso.
Otros consejos
los valores realmente variarán en longitud, así que lo intentaré así mañana:
WRITETEXT MyTable.MyField @ptrval @Data1
UPDATETEXT MyTable.MyField @ptrval Len(@Data1) NULL @Data2
lo anterior funcionó pero primero tuve que calcular la longitud:
WRITETEXT MyTable.MyField @ptrval @Data1
SET @Len = LEN(@Data1)
UPDATETEXT MyTable.MyField @ptrval @Len NULL @Data2
no estoy seguro de por qué no puede usar una función como LEN () donde se espera un parámetro.
Tuve un momento difícil con este.
Estaba tratando de guardar cadenas largas (contenido de cuadros de texto enriquecido) en un campo ntext.
La solución resultó ser bastante 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()
Nota: strQuestionQUESTION tenía aproximadamente 3000 caracteres o formato de código y texto. " Num " es solo un campo entero en la "Prueba" base de datos que también contiene el nombre de campo ntext " Text "