У меня есть столбец в таблице, в котором есть имена, слишком большие для веб-сайта, к которому он подключается. Что-нибудь 50 или больше вызывает проблемы. Я написал это, чтобы попытаться сократить, добавив марку + модель + год с четырьмя числами. У меня проблема с обновлением внутри цикла while. Возможно, мне следует использовать временную таблицу, и я подхожу к этому совершенно неправильно. Спасибо за помощь.

SELECT *

FROM [Year] y

INNER JOIN Year_Model ym
ON y.YearId = ym.YearId

INNER JOIN Model m
on m.ModelId = ym.ModelId

INNER JOIN Make ma
on ma.MakeId = m.MakeId

--WHERE (len(m.name) + len(ma.name) + 4)>= 50

WHILE (len(m.name) + len(ma.name) + 4)>= 50
BEGIN
DECLARE @ModelId integer;
SET @ModelId = m.ModelId
DECLARE @NewModelName string;
SET @NewModelName = (Select Left(m.name, (len(m.name)-1))
UPDATE m
SET m.name = @NewModelName
WHERE @ModelId = m.ModelId
END
GO
0
Tim Freese 27 Дек 2013 в 21:14

2 ответа

Лучший ответ

Попробуй это:

UPDATE [Model] SET [name]=xx.ShortName
FROM 
(
    SELECT m.ModelID,LEFT(m.name,len(m.name)-1) as ShortName
    FROM [Year] y
    INNER JOIN Year_Model ym ON y.YearId = ym.YearId
    INNER JOIN Model m  on m.ModelId = ym.ModelId
    INNER JOIN Make ma  on ma.MakeId = m.MakeId
    WHERE (len(m.name) + len(ma.name) + 4)>= 50
) xx
WHERE xx.ModelID = [Model].ModelId

ПРИМЕЧАНИЕ: ЛЕВЫЙ должен быть LEFT (m.name, len (m.name) -1)

Не оригинал LEFT (m.Name, len (m.Name (-1)))

Но сначала запустите внутренний запрос, чтобы убедиться, что вы видите желаемые результаты, прежде чем запускать фактическое udpate ...

1
Sparky 27 Дек 2013 в 20:30

Ничего не укорачивайте. Вам могут понадобиться полные имена для чего-то еще.

Вы можете использовать функцию t-sql left () для выбора первых x символов. Кроме того, вы можете выбрать все имя и использовать код приложения, чтобы отформатировать его по своему усмотрению.

2
Dan Bracuk 27 Дек 2013 в 17:24