ما هي أسهل طريقة لاستخدام T-SQL / MS-SQL لإلحاق سلسلة بخلايا الجدول الموجودة؟

StackOverflow https://stackoverflow.com/questions/17624

  •  09-06-2019
  •  | 
  •  

سؤال

لدي جدول يحتوي على عمود "اسم الملف".لقد قمت مؤخرًا بإجراء إدراج في هذا العمود ولكن في عجلة من أمري نسيت إلحاق امتداد الملف بجميع أسماء الملفات التي تم إدخالها.لحسن الحظ أنها كلها صور ".jpg".

كيف يمكنني بسهولة تحديث عمود "اسم الملف" لهذه الحقول المدرجة (بافتراض أنه يمكنني تحديد الصفوف الأخيرة بناءً على قيم المعرفات المعروفة) لتضمين الامتداد ".jpg"؟

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

المحلول

الحل هو:

UPDATE tablename SET [filename] = RTRIM([filename]) + '.jpg' WHERE id > 50

مطلوب RTRIM لأنه بخلاف ذلك سيتم تحديد العمود [اسم الملف] بالكامل لتسلسل السلسلة، أي.إذا كان عمودًا varchar(20) وكان اسم الملف مكونًا من 10 أحرف فقط، فسيظل يحدد تلك الأحرف العشرة ثم 10 مسافات.سيؤدي هذا بدوره إلى حدوث خطأ أثناء محاولتك احتواء 20 + 3 أحرف في حقل مكون من 20 حرفًا.

نصائح أخرى

تكون إجابة MattMitchell صحيحة إذا كان العمود CHAR(20)، ولكنها غير صحيحة إذا كان VARCHAR(20) ولم يتم إدخال المسافات بشكل صريح.

إذا قمت بتجربته في حقل CHAR بدون وظيفة RTRIM فسوف تحصل على "يمكن فصل البيانات الثنائيه أو المتسلسله" خطأ.

واحدة سهلة لطيفة على ما أعتقد.

update MyTable
set filename = filename + '.jpg'
where ...

يحرر:Ooh +1 لإجابة @MattMitchell لاقتراح rtrim.

إذا جاءت البيانات الأصلية من عمود أو متغير char (قبل إدراجها في هذا الجدول)، فسيتم إلحاق المسافات بالبيانات الأصلية قبل أن تصبح varchar.

DECLARE @Name char(10), @Name2 varchar(10)
SELECT
  @Name = 'Bob',
  @Name2 = 'Bob'

SELECT
  CASE WHEN @Name2 = @Name THEN 1 ELSE 0 END as Equal,
  CASE WHEN @Name2 like @Name THEN 1 ELSE 0 END as Similiar

درس الحياة :لا تستخدم شار أبدًا.

كنت أرغب في تعديل "درس الحياة" لديفيد بي.أعتقد أنه يجب أن يكون "لا تستخدم أبدًا char لقيم السلسلة ذات الطول المتغير" -> هناك استخدامات صالحة لنوع بيانات char، ولكن ليس بالعدد الذي يعتقده بعض الناس :)

يمكن العثور على إجابة لغز المسافات الزائدة في ملف ANSI_PADDING

للمزيد من المعلومات قم بزيارة: تعيين ANSI_PADDING (Transact-SQL)

الافتراضي هو ANSI_PADDIN ON.سيؤثر هذا على العمود فقط عند إنشائه وليس على الأعمدة الموجودة.

قبل تشغيل استعلام التحديث، تحقق من بياناتك.كان من الممكن أن يتم اختراقها.

قم بتشغيل الاستعلام التالي للعثور على الصفوف المخترقة:

SELECT *
FROM tablename 
WHERE LEN(RTRIM([filename])) > 46 
-- The column size varchar(50) minus 4 chars 
-- for the needed file extension '.jpg' is 46.

إما أن هذه الصفوف فقدت بعض الأحرف أو لا توجد مساحة كافية لإضافة امتداد الملف.

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