سؤال

كنت ترغب في الاتصال المخزنة بروك على MS SQL معلمة نوع من الطابع الزمني داخل T-SQL لا ADO.NET باستخدام VARCHAR القيمة (مثلا ، '0x0000000002C490C8').

ماذا تفعل ؟

تحديث:هذا هو المكان الذي لديك "الطابع الزمني" قيمة القادمة في لكم ولكن موجود فقط كما VARCHAR.(أعتقد الناتج متغير على آخر المخزنة proc, لكنه ثابت بالفعل كما VARCHAR له قيمة الطابع الزمني).لذلك إلا إذا كنت ترغب في بناء ديناميكية SQL, كيف يمكنك برمجيا تغيير القيمة المخزنة في VARCHAR في صالح الزمني?

هل كانت مفيدة؟

المحلول

وتتم إدارة نوع البيانات الطابع الزمني بواسطة SQL Server. أنا لم أر قط كان عليه في أي مكان آخر من حيث نوع عمود الجدول. وبهذه الصفة، فإن عمود من نوع الطابع الزمني تعطيك ترتيبي الدقيق لإدراج الماضي / تحديث على التوالي فيما يتعلق بجميع تحديثات أخرى في قاعدة البيانات. لمعرفة ترتيبي الأخير في قاعدة البيانات بأكملها، يمكنك استرداد قيمةDBTS أو rowversion ().

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

<اقتباس فقرة> الطابع الزمني (SQL للعمليات)

هو نوع البيانات التي تكشف إنشاؤه تلقائيا، أرقام ثنائية فريدة داخل قاعدة البيانات. يستخدم الطابع الزمني عموما كآلية لصفوف الجدول ختم الإصدار. حجم التخزين 8 بايت. نوع البيانات الطابع الزمني هو مجرد رقم تزايد ولا يحافظ على تاريخ أو وقت. لتسجيل التاريخ أو الوقت، استخدام نوع البيانات التاريخ والوقت.

وبالتالي، لا يمكن تعيين قيمة المضطربة عمود الطابع الزمني وغير قابلة للتغيير على أي modifaction إلى الصف. يمكنك، ومع ذلك، وتجميد قيمة الطابع الزمني إلى (8) قيمة ثنائي متغير.

وعلى سبيل المثال، ويقول كان لديك الجدول المصدر والجدول الهدف.

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

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

وبعد ذلك، في عملية الاستخراج، قد ترغب في التقاط كل ما تم تحديثها منذ آخر مرة قمت بتشغيل عملية الاستخراج.

و 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

إذا كنت تواجه مشاكل، أول تخميني سيكون أن جوهر المشكلة في التحويل من varchar إلى لثنائي متغير (8)، وليس إلى نوع الطابع الزمني.

لمزيد من المعلومات (وربما أكثر من اللازم)، انظر التعليق (الرابع واحد لأسفل) غادرت إلى آخر بلوق <لأ href = "http://vadivel.blogspot.com/2004/10/about-timestamp-datatype من ناتجها SQL-server.html؟ showComment = 1213612020000 "يختلط =" نوفولو noreferrer "> http://vadivel.blogspot.com/2004/10/about-timestamp-datatype-of-sql-server.html؟showComment= 1213612020000

نصائح أخرى

ومنذ الطابع الزمني متوافق مع ثنائي متغير الحل لن يكون هذا في 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);

ومرجع. <وأ href = "http://blogs.msdn.com/b/sqltips/archive/2008/07/02/converting-from-hex-string-to-varbinary-and-vice-versa.aspx" يختلط = " نوفولو "> MSN المدونات

زمني هو لغويا أي ما يعادل VARBINARY(8) (nullable) أو ثنائي(8) (غير nullable).لذلك يجب أن تكون قادرة على استدعاء الإجراء مع المعلمة المسعرة ، على النحو التالي:

EXEC usp_MyProc @myParam=0x0000000002C490C8

انظر أيضا كتب SQL

تحرير المحدثة السؤال ...

لقد حاول عدد قليل من التجارب.بصراحة لدي فضول أن أعرف كيف حصلت على هذا يمثل varchar في المقام الأول ، لأن عندما كنت تفعل شيئا مثل:

select top 10 convert(varchar, ts) from foo

حيث ts هو زمني ، أحصل على 10 صفوف فارغة.(إذا كنت لا تحويل تلك الطوابع.)

ومع ذلك, حاولت العمل في الاتجاه الصحيح ...أنا فعلت هذا:

select convert(timestamp, '0x0000000000170B2E')

وتحويل أدى إلى 0x3078303030303030.بحيث لن يلعب أيضا.ولا تحويل الثنائية.

أنا أكره أن أقول ذلك, ولكن قد يكون عالقا في SQL ديناميكية في العالم.كنت حقا مثل أن تكون خاطئة ، على الرغم من.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top