yyyymmdd yyyy when from failed converting convert conversion and sql-server tsql timestamp varchar

sql server - yyyy - ¿Cómo se convierte VARCHAR a TIMESTAMP en MSSQL?



format sql (3)

Le gustaría llamar a un procedimiento almacenado en MS SQL que tiene un tipo de parámetro TIMESTAMP dentro de T-SQL, no ADO.NET utilizando un valor VARCHAR (por ejemplo, ''0x0000000002C490C8'').

¿Qué haces?

ACTUALIZAR: Aquí es donde tiene un valor de "Indicación de fecha y hora", pero solo existe como VARCHAR. (Piensa en la variable OUTPUT en otro proceso almacenado, pero ya está fijo como VARCHAR, solo tiene el valor de TIMESTAMP). Entonces, a menos que decida construir Dynamic SQL, ¿cómo puede cambiar programáticamente un valor almacenado en VARCHAR en un TIMESTAMP válido?


Un TIMESTAMP es semánticamente equivalente a VARBINARY (8) (nulo) o BINARY (8) (no aceptan nulos). Por lo tanto, debe poder invocar el procedimiento con el parámetro sin comillas, de la siguiente manera:

EXEC usp_MyProc @myParam=0x0000000002C490C8

Ver también libros SQL en línea

EDITAR para la pregunta actualizada ...

Solo intenté algunos experimentos. Francamente, tengo curiosidad sobre cómo se representa esto como varchar en primer lugar, ya que cuando hago algo como:

select top 10 convert(varchar, ts) from foo

Donde ts es una marca de tiempo, obtengo 10 filas en blanco. (Si no me convierto, veo mis marcas de tiempo).

Sin embargo, traté de trabajar desde la dirección correcta ... Hice esto:

select convert(timestamp, ''0x0000000000170B2E'')

Y la conversión resultó en 0x3078303030303030 . Entonces eso tampoco va a jugar. Tampoco se convertirá en binario.

Odio decirlo, pero puede que estés atrapado en un mundo de SQL dinámico. Sin embargo, me gustaría estar realmente equivocado.


Un tipo de datos de marca de tiempo es administrado por SQL Server. Nunca lo he visto usado en otro lugar que no sea el tipo columna de la mesa. En esa capacidad, la columna de tipo de marca de tiempo le dará un ordinal riguroso de la última inserción / actualización en la fila en relación con todas las demás actualizaciones en la base de datos. Para ver el ordinal más reciente en toda la base de datos, puede recuperar el valor de @@ DBTS o rowversion ().

Por http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx

marca de tiempo (Transact-SQL)

es un tipo de datos que expone números binarios únicos generados automáticamente dentro de una base de datos. la marca de tiempo generalmente se usa como un mecanismo para las filas de la tabla de estampado de versiones. El tamaño de almacenamiento es de 8 bytes. El tipo de datos de marca de tiempo es solo un número creciente y no conserva una fecha o una hora. Para registrar una fecha u hora, use un tipo de datos de fecha y hora.

Por lo tanto, el valor volátil de una columna de marca de tiempo no se puede establecer y está sujeto a cambios en cualquier modificación a la fila. Sin embargo, puede congelar el valor de la marca de tiempo en un valor varbinary (8).

Por ejemplo, supongamos que tiene una tabla de origen y una tabla de destino.

CREATE TABLE tblSource (
Id int not null
colData int not null
colTimestamp timestamp null)

CREATE TABLE tblTarget (
Id int not null
colData int no nulo
colTimestampVarBinary varbinary (8) null)

Luego, en un proceso de extracción, es posible que desee capturar todo lo que se ha actualizado desde la última vez que ejecutó el proceso de extracción.

DECLARE @maxFrozenTargetTimestamp varchar(8)
SELECT @maxFrozenTargetTimestamp = max(colStamp) FROM tblTarget

INSERT tblTarget(Id, colData, colTimestampVarBinary)
SELECT
Id
,colData
, colTimestampVarBinary = convert(varbinary(8) colTimestamp)
FROM
tblSource
WHERE
tblSource.colTimestamp > @maxFrozenTargetTimestamp

Si tiene problemas, mi primera suposición sería que la clave de su problema está en la conversión de un varchar a varbinary (8), y no en un tipo de sello de tiempo.

Para obtener más información (tal vez demasiado), vea el comentario (cuarto abajo) Dejé la entrada del blog http://vadivel.blogspot.com/2004/10/about-timestamp-datatype-of-sql-server.html ? showComment = 1213612020000


Como timestamp es compatible con varbinary, la solución será esto en SQL Server 2008:

declare @hexstring varchar(max); set @hexstring = ''0xabcedf012439''; select CONVERT(varbinary(max), @hexstring, 1); set @hexstring = ''abcedf012439''; select CONVERT(varbinary(max), @hexstring, 2);

Referencia. Blogs de MSN