簡體   English   中英

使用T-SQL / MS-SQL將字符串附加到現有表格單元格的最簡單方法是什么?

[英]What is the easiest way using T-SQL / MS-SQL to append a string to existing table cells?

我有一個帶有'filename'列的表。 我最近在此列中執行了插入操作,但在我的倉促中忘記將文件擴展名附加到輸入的所有文件名中。 幸運的是,它們都是'.jpg'圖像。

如何輕松更新這些插入字段的“文件名”列(假設我可以根據已知的id值選擇最近的行)以包含“.jpg”擴展名?

解決方案是:

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

RTRIM是必需的,因為否則將為字符串連接選擇整個[filename]列,即如果它是varchar(20)列並且文件名只有10個字母長,那么它仍將選擇那10個字母然后10個空格。 當您嘗試將20 + 3個字符放入20個字符長的字段時,這將導致錯誤。

如果列是CHAR(20),則MattMitchell的答案是正確的,但如果它是VARCHAR(20)並且沒有明確輸入空格則不是真的。

如果你在沒有RTRIM函數的CHAR字段上嘗試它,你將得到“字符串或二進制數據將被截斷”錯誤。

我覺得很容易。

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。

可以在ANSI_PADDING中找到尾隨空格之謎的答案

有關更多信息,請訪問: SET 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.

這些行丟失了一些字符,或者沒有足夠的空間來添加文件擴展名。

我想調整David B的“生活課”。 我認為它應該是“永遠不要使用char作為可變長度的字符串值” - > char數據類型有有效的用途,只是沒有人們想象的那么多:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM