SQL Server приводит varchar к int - PullRequest
       0

SQL Server приводит varchar к int

0 голосов
/ 25 октября 2011

У меня есть таблица со столбцом «Значение», которая является varchar. В одной строке в этом столбце ставится «10». Этот «номер» нужно будет добавить и вычесть, но я могу сделать это напрямую, потому что это varchar. Итак, следующее выдает ошибку:

update Fields  
set Value = Value - 1
from Fields f, FTypes ft
where ft.Name = 'Field Count'
    and ft.ID = f.ID_FT
    and f.ID_Project = 186              

GO

Как мне привести / преобразовать значение в целое число, выполнить математические вычисления, а затем снова установить как varchar?

Ответы [ 2 ]

3 голосов
/ 25 октября 2011

Замечание Мартина Смита -> Если в него входят только числовые данные и вы всегда будете выполнять такие операции, это сэкономит ваше время и избавит вас от необходимости выполнять эту конвертацию.

Как говорится, вы можете сделать -

update Fields  
set ColumnName = cast( (cast(ColumnName as int) - 1) as varchar(nn))
from Fields f, FTypes ft
where ft.Name = 'Field Count'
    and ft.ID = f.ID_FT
    and f.ID_Project = 186   

, где nn - исходное определение вашего столбца varchar

3 голосов
/ 25 октября 2011

Вам нужно использовать CAST дважды - один раз, чтобы сделать столбец Value INT, чтобы вы могли вычесть из него 1, а затем вернуться к VARCHAR(x):

update dbo.Fields  
set Value = CAST((CAST(Value AS INT) - 1) AS VARCHAR(20))
from dbo.Fields f
inner join dbo.FTypes ft ON ft.ID = f.ID_FT
where ft.Name = 'Field Count'
    and f.ID_Project = 186      

Кроме того, я бы рекомендовал всегда использовать префикс dbo. для всех ваших объектов базы данных, и я бы всегда выступал за новый стандартный синтаксис JOIN ANSI, который является более выразительным (более понятным для чтения и понимания) ипомогает избежать нежелательных декартовых произведений (забывая указать условие JOIN в предложении WHERE ....)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...