SQL Server Express: проблема ЗАМЕНЫ в SQL Server Mgmt Studio Express

У меня огромная проблема с функцией REPLACE SQL в Microsoft SQL Server Management Studio Express.

Когда я делаю следующий запрос

SELECT     REPLACE('ArticleNumber', 'S401', 'I0010')
SELECT     REPLACE('ArticleNumber', 'S302', 'I0020')
SELECT     REPLACE('ArticleNumber', 'S303', 'I0030')    
SELECT     REPLACE('ArticleNumber', 'S304', 'I0040')    
SELECT     REPLACE('ArticleNumber', 'S305', 'I0050')    
SELECT     REPLACE('ArticleNumber', 'S306', 'I0060')    
FROM       tbl.Products

Затем Studio Express Response с этим SELECT не был распознан.

Что я делаю не так?


person elhombre    schedule 16.10.2009    source источник
comment
Спасибо всем за помощь, кажется, что МОЯ проблема не была решена, но на вопрос был дан правильный ответ. Я снова открыл новый вопрос, объясняя это по-другому stackoverflow.com/questions/1629201/   -  person elhombre    schedule 27.10.2009


Ответы (5)


В зависимости от того, что вы пытаетесь сделать...

Вам нужен либо вложенный REPLACE...

SELECT
     REPLACE
          REPLACE
               REPLACE
                    REPLACE
                         REPLACE
                              REPLACE(ArticleNumber, 'S401', 'I0010'),
                         'S302', 'I0020'),
                    'S303', 'I0030'),
               'S304', 'I0040'),
          'S305', 'I0050'),
     'S306', 'I0060')    
FROM       tbl.Products

..или несколько выходных столбцов

SELECT
     REPLACE(ArticleNumber, 'S401', 'I0010'),
     REPLACE(ArticleNumber, 'S302', 'I0020'),
     REPLACE(ArticleNumber, 'S303', 'I0030'),   
     REPLACE(ArticleNumber, 'S304', 'I0040'),    
     REPLACE(ArticleNumber, 'S305', 'I0050'),    
     REPLACE(ArticleNumber, 'S306', 'I0060')  
FROM       tbl.Products

Примечание: ошибка возникает из-за механизма базы данных, который пытается запустить это. SSMS — это прославленный текстовый редактор с некоторыми полезными дополнениями.

person gbn    schedule 16.10.2009
comment
Спасибо за ваш подробный ответ, я попробовал второй код в вашем посте. Но когда я разрешаю Studio Express запускать код, он будет висеть AS Expr после каждого закрытого восклицательного знака с числами, считающими вверх. Вывод, который я получаю, представляет собой набор столбцов, каждый из которых назван expr с числовыми значениями. Каждый столбец содержит одну и ту же исходную таблицу, только одно значение которой было изменено. когда я перехожу в обычный вид, ничего не изменилось. Я просто хочу, чтобы все старые значения были заменены новыми. Вы теперь, может быть, как я могу добиться этого результата? - person elhombre; 19.10.2009

Номер статьи должен быть в кавычках? Ваша замена ничего не заменит, так как S401, S302 и т. д. определенно не входят в «ArticleNumber».

Вы захотите последовать совету gbn по использованию вложенного оператора, но с фактическим столбцом.

SELECT
 REPLACE(
      REPLACE(
           REPLACE(
                REPLACE(
                     REPLACE(
                          REPLACE(ArticleNumber, 'S401', 'I0010'),
                     'S302', 'I0020'),
                'S303', 'I0030'),
           'S304', 'I0040'),
      'S305', 'I0050'),
 'S306', 'I0060')
FROM tbl.Products

Крис

person KSimons    schedule 16.10.2009

может быть, я просто не понимаю, что вы пытаетесь сделать, но из того, что я могу прочитать здесь, вы пытаетесь заменить «S401» в строке «ArticleNumber» на «I0010», поэтому результатом выбора всегда будет «ArticleNumber».... и

ОТ tbl.Products бесполезно

если вы хотите заменить значение поля ArticleNumber из продуктов таблицы, вам следует попробовать ArticleNumber без кавычек, но обратитесь к ответу GBN для точного синтаксиса.

person Lil'Monkey    schedule 16.10.2009

Это немного другой способ сделать это.

SELECT COALESCE(ch.New, pr.ArticleNumber) AS ArticleNumber
FROM tbl.Products pr
   LEFT JOIN (
   SELECT 'S401' AS Old, 'I0010' as New
   UNION
   SELECT 'S302' AS Old, 'I0020' AS New
   UNION ... etc
) ch ON ch.Old = pr.ArticleNumber
person Darrel Miller    schedule 16.10.2009
comment
ON CHARINDEX(ch.Old,pr.ArticleNumber) › 0? Затем добавить DISTINCT? - person Peter Radocchia; 16.10.2009
comment
@ Питер, боюсь, ты потерял меня из-за этого предложения. Какие проблемы он решает? - person Darrel Miller; 16.10.2009
comment
Если номер статьи что-то вроде Q45-S401, REPLACE() вернет Q45-I0010. CHARINDEX() в JOIN и DISTINCT REPLACE() в SELECT также вернут Q45-I0010. JOIN...COALESCE вернет исходное значение Q45-S401. - person Peter Radocchia; 16.10.2009
comment
Это вообще не сработает, если только номер статьи не точно устарел, и вы не хотите заменить весь номер статьи новым. REPLACE ищет ArticleNumber и заменяет все содержащиеся последовательности Old на New. - person gbn; 16.10.2009
comment
@gbn Да, ты прав. Было довольно трудно понять замысел оригинального плаката. Я предположил, что он заменял старые номера новыми номерами. - person Darrel Miller; 16.10.2009
comment
@ Даррен Миллер Да, это то, чем я занимаюсь, заменяя старые номера новыми. - person elhombre; 19.10.2009

Удалите кавычки вокруг ArticleNumber и вставьте REPLACE:

SELECT  
  ArticleNumber = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(ArticleNumber 
    , 'S401', 'I0010')    
    , 'S302', 'I0020')    
    , 'S303', 'I0030')    
    , 'S304', 'I0040')    
    , 'S305', 'I0050')    
    , 'S306', 'I0060')    

FROM tbl.Products
person Peter Radocchia    schedule 16.10.2009