Динамическое имя столбца SQL в качестве счетчика - PullRequest
0 голосов
/ 15 января 2019

Я использую Microsoft SQL Server, я хочу написать динамический SQL-запрос, который обновит строку, проверив различные столбцы в предложении WHERE.

Столбцы в предложении WHERE имеют формат X1, X2, ..., X10 - поэтому я хочу использовать @cnt в качестве счетчика, объединенного с именем столбца X на каждой итерации.

Я получаю сообщение об ошибке:

Журнал транзакций для базы данных DBName: заполнен из-за 'LOG_BACKUP'

Если я напишу запрос 10 раз, он будет работать нормально, так что это должно быть что-то с циклом или преобразованием int в char

Пока это мой запрос - добавлены все важные части:

 @y char(3) //SP Parameter

 DECLARE @table varchar(50)
 DECLARE @sql varchar(max)

 DECLARE @cnt INT = 1
 DECLARE @count VARCHAR(2)

 SET @table = CONCAT('X_',@y)

 WHILE @cnt <= 10     
   SET @count = CAST(@cnt as VARCHAR);
BEGIN
  SET @sql = CONCAT('UPDATE ',@table,' SET X1 = CASE WHEN X1 <> '''' THEN X1 ELSE ''VALUE'' END,
  X2 = CASE WHEN X1 = '''' or X2 <> '''' THEN X2 ELSE ''VALUE'' END,
  X3 = CASE WHEN X2 = '''' or X3 <> '''' THEN X3 ELSE ''VALUE'' END,
  X4 = CASE WHEN X3 = '''' or X4 <> '''' THEN X4 ELSE ''VALUE'' END,
  X5 = CASE WHEN X4 = '''' or X5 <> '''' THEN X5 ELSE ''VALUE'' END,
  X6 = CASE WHEN X5 = '''' or X6 <> '''' THEN X6 ELSE ''VALUE'' END,
  X7 = CASE WHEN X6 = '''' or X7 <> '''' THEN X7 ELSE ''VALUE'' END,
  X8 = CASE WHEN X7 = '''' or X8 <> '''' THEN X8 ELSE ''VALUE'' END,
  X9 = CASE WHEN X8 = '''' or X9 <> '''' THEN X9 ELSE ''VALUE'' END,
  X10 = CASE WHEN X9 = '''' or X10 <> '''' THEN X10 ELSE ''VALUE'' END
  WHERE X'+@count+' IN (SELECT P_CODE FROM P WHERE DESCRIPTION LIKE ''%new%'' AND Y= ''',@y,''');
  EXEC (@sql);
  SET @cnt=@cnt+1;
 END

1 Ответ

0 голосов
/ 15 января 2019

Я только что попытался исправить синтаксис, не знаю, какова конечная цель?

declare @y char(3)='1'

DECLARE @table varchar(50)

DECLARE @sql varchar(max)

DECLARE @cnt INT = 1

DECLARE @count VARCHAR(30)

SET @table = CONCAT('X_',@y)

WHILE (@cnt <= 10 )

BEGIN

SET @count = CAST(@cnt as VARCHAR(3));


set @sql=''


SET @sql = 'UPDATE '+@table+' SET X1 = CASE WHEN X1 <> '''' THEN X1 ELSE ''VALUE'' END,
X2 = CASE WHEN X1 = '''' or X2 <> '''' THEN X2 ELSE ''VALUE'' END,
X3 = CASE WHEN X2 = '''' or X3 <> '''' THEN X3 ELSE ''VALUE'' END,
X4 = CASE WHEN X3 = '''' or X4 <> '''' THEN X4 ELSE ''VALUE'' END,
X5 = CASE WHEN X4 = '''' or X5 <> '''' THEN X5 ELSE ''VALUE'' END,
X6 = CASE WHEN X5 = '''' or X6 <> '''' THEN X6 ELSE ''VALUE'' END,
X7 = CASE WHEN X6 = '''' or X7 <> '''' THEN X7 ELSE ''VALUE'' END,
X8 = CASE WHEN X7 = '''' or X8 <> '''' THEN X8 ELSE ''VALUE'' END,
X9 = CASE WHEN X8 = '''' or X9 <> '''' THEN X9 ELSE ''VALUE'' END,
X10 = CASE WHEN X9 = '''' or X10 <> '''' THEN X10 ELSE ''VALUE'' END
WHERE X'+@count+' IN (SELECT P_CODE FROM P WHERE [DESCRIPTION] LIKE ''%new%'' AND Y= '+@y+')';
--EXEC (@sql);

print @sql

SET @cnt=@cnt+1;

END

I) Избегать RBAR (например, цикл, курсор)

ii) Использовать sp_executesql

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