Как включить разрыв в динамический SQL? - PullRequest
0 голосов
/ 26 марта 2019

У меня есть этот запрос, который помогает мне выбрать имена столбцов, которые имеют нулевые значения.что я хочу сделать, это обновить только значение первого столбца.Я попытался включить оператор break после запроса на обновление, чтобы выйти из цикла while курсора, но я получаю эту ошибку. Невозможно использовать оператор BREAK вне области действия оператора WHILE.это код, который я пробовал

AS
declare @col varchar(255), @cmd varchar(max)

DECLARE getinfo cursor for
SELECT c.name FROM sys.tables t JOIN sys.columns c ON t.Object_ID = c.Object_ID
WHERE t.Name = 'Grilles_de_tailles' and c.name like 'T%'

OPEN getinfo

FETCH NEXT FROM getinfo into @col 

WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @cmd = 'IF NOT EXISTS (SELECT TOP 1 * FROM Grilles_de_tailles WHERE [' + @col + '] IS NOT NULL and Code_Grille_BW = '+@codegrillebw+') begin 
update Grilles_de_tailles set ['+@col+'] = '+@libtaille+' where Code_Grille_BW = '+@codegrillebw+'
break
end'
    EXEC(@cmd)
    FETCH NEXT FROM getinfo into @col
END

CLOSE getinfo
DEALLOCATE getinfo

Я тоже пробовал этот способ

AS
declare @col varchar(255), @cmd varchar(max), @breakval numeric
SET @breakval=0

DECLARE getinfo cursor for
SELECT c.name FROM sys.tables t JOIN sys.columns c ON t.Object_ID = c.Object_ID
WHERE t.Name = 'Grilles_de_tailles' and c.name like 'T%'

OPEN getinfo

FETCH NEXT FROM getinfo into @col 

WHILE @@FETCH_STATUS = 0 AND @breakval=0
BEGIN
    SELECT @cmd = 'IF NOT EXISTS (SELECT TOP 1 * FROM Grilles_de_tailles WHERE [' + @col + '] IS NOT NULL and Code_Grille_BW = '+@codegrillebw+') begin 
update Grilles_de_tailles set ['+@col+'] = '+@libtaille+' where Code_Grille_BW = '+@codegrillebw+'
set '+@breakval+' = '+1+'

end'
    EXEC(@cmd)
    FETCH NEXT FROM getinfo into @col
END

CLOSE getinfo
DEALLOCATE getinfo

таким образом, он даже не входит в цикл while

Я пытался использоватьGOTO, это код





DECLARE getinfo cursor 
for 
SELECT c.name FROM sys.tables t JOIN sys.columns c ON t.Object_ID = c.Object_ID 

WHERE t.Name = 'Grilles_de_tailles' and c.name like 'T%'


OPEN getinfo
FETCH NEXT FROM getinfo into @col 


WHILE @@FETCH_STATUS = 0

BEGIN
 IF NOT EXISTS (SELECT TOP 1 * FROM Grilles_de_tailles WHERE  @col  IS NOT NULL 
and Code_Grille_BW = '2456')
BEGIN 
print ('aaaa')
update Grilles_de_tailles set @col = 'M'
GOTO Branch_one


END


    FETCH NEXT FROM getinfo into @col

END

Branch_one:
CLOSE getinfo
DEALLOCATE getinfo ``` 

nothing happened I got "Commands completed successfully" but it seems that it didn't execute the instructions between BEGIN .. END since the print didn't work

1 Ответ

0 голосов
/ 09 апреля 2019

Пример:

declare @col varchar(255), @cmd varchar(max)

DECLARE getinfo cursor for
SELECT c.name FROM sys.tables t JOIN sys.columns c ON t.Object_ID = c.Object_ID
WHERE t.Name = 'Grilles_de_tailles' and c.name like 'T%'

OPEN getinfo

FETCH NEXT FROM getinfo into @col 

WHILE @@FETCH_STATUS = 0
BEGIN
    declare @Break bit=0
    SELECT @cmd = 'IF NOT EXISTS (SELECT TOP 1 * FROM Grilles_de_tailles WHERE [' + @col + '] IS NOT NULL and Code_Grille_BW = '+@codegrillebw+') begin 
update Grilles_de_tailles set ['+@col+'] = '+@libtaille+' where Code_Grille_BW = '+@codegrillebw+'
SET @Break=1
end'
    exec sp_executesql @cmd,'@Break bit OUTPUT',@Break OUTPUT
    IF @Break=1
        break

    FETCH NEXT FROM getinfo into @col
END

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