Итерация по списку символов в T-SQL - PullRequest
0 голосов
/ 27 сентября 2018

Я ищу какой-нибудь эффективный способ решения следующей проблемы в T-SQL:

for i in L = ['A', 'B',..., 'N'] 
INSERT INTO MyTable1 (SomeCol1, SomeCol2)
SELECT SomeCol1, SomeCol2 FROM SomeTable1 WHERE <conditions>
UPDATE MyTable1 SET MyCol1 = i WHERE MyCol1 = 'the default value of MyCol1'

Учитывая, что мой список символов L длинный, я не хочу делать это один раздля каждого элемента в отдельности.Итак, если есть лучшее решение, чем использование цикла, я заинтересован в этом, а также в том, что он решает проблему.Обратите внимание, что я не пытаюсь использовать правильный синтаксис выше - я также хотел бы знать, как приблизиться к части for i in L = ['A', 'B',..., 'N'] в T-SQL.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Это решило мою проблему, и я думаю, что это далеко не оптимальный способ сделать это.

CREATE TABLE MyTable2 (MyCol2 VARCHAR(5))
INSERT INTO MyTable2 (MyCol2) VALUES ('A')
INSERT INTO MyTable2 (MyCol2) VALUES ('B')
.
.
.
INSERT INTO MyTable2 (MyCol2) VALUES ('N')
ALTER TABLE MyTable2 ADD ID INT IDENTITY

WHILE (SELECT COUNT(*) FROM MyTable2) > 0
BEGIN
  INSERT INTO MyTable1 (SomeCol1, SomeCol2)
  SELECT SomeCol1, SomeCol2 FROM SomeTable1 WHERE <conditions>
  UPDATE MyTable1 
  SET MyCol1 = (SELECT MyCol2 FROM MyTable2 HAVING ID = MIN(ID)) 
  WHERE MyCol1 = 'the default value of MyCol1'
  DELETE FROM MyTable2 WHERE MyCol2 = (SELECT MyCol2 FROM MyTable2 HAVING ID = MIN(ID))
END
0 голосов
/ 27 сентября 2018

Ваш вопрос очень неясен ...

SQL-сервер - это основанный на множестве инструмент .Всякий раз, когда вы чувствуете необходимость зацикливать / повторять в наборе, вы, вероятно, подходите к своей проблеме с неправильной стороны.

Первый вопрос: как вы предоставляете свой список символов ?Это таблица, JSON, XML, CSV-строка?

В любом случае ваша цель должна состоять в том, чтобы получить его как set .

Просто чтобы показатьпринципы: если вы предоставляете свои символы, например, в виде простого списка, вы можете использовать рекурсивный CTE

DECLARE @L VARCHAR(100)='ACFHJTZJ'; --add as many as you need

WITH recCTE AS
(
    SELECT 1 AS Pos,SUBSTRING(@L,1,1) AS OneChar
    UNION ALL
    SELECT r.Pos+1, SUBSTRING(@L,r.Pos+1,1)
    FROM recCTE r
    WHERE r.Pos<LEN(@L)
)
SELECT /*add DISTINCT if you want to surpress repeating characters*/ 
       Pos,OneChar 
FROM recCTE;

. Это вернет все буквы в качестве производной таблицы.

Вы можете использовать такой набор (однако вы создаете его) в выражении на основе набора, как здесь:

DECLARE @L VARCHAR(100)='ACFHJTZJ'; --add as many as you need
DECLARE @tbl TABLE(SomeColumn CHAR(1));

WITH recCTE AS
(
    SELECT 1 AS Pos,SUBSTRING(@L,1,1) AS OneChar
    UNION ALL
    SELECT r.Pos+1, SUBSTRING(@L,r.Pos+1,1)
    FROM recCTE r
    WHERE r.Pos<LEN(@L)
)
INSERT INTO @tbl(SomeColumn)
SELECT DISTINCT OneChar 
FROM recCTE;

SELECT * FROM @tbl;

Это будет вставлять каждый отдельный char в таблицу @tbl.Конечно, вы можете использовать это и в любом другом контексте (например, WHERE условие).

В любом случае, это утверждение не должно измениться, содержит ли ваш список 1, 10 или тысячу элементов.

Если вам нужна дополнительная помощь, вам действительно следует предоставить дополнительную справочную информацию.Лучше всего было создать автономный сценарий, как я делал выше.И вы можете прочитать о проблеме XY ...

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