Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Base de Dados SQL do Azure
Instância Gerida do Azure SQL
Azure Synapse Analytics
Sistema de Plataforma de Análise (PDW)
Ponto de Extremidade de Análise SQL no Microsoft Fabric
Armazém no Microsoft Fabric
Base de Dados SQL no Microsoft Fabric
Define a variável local especificada, criada anteriormente usando a DECLARE @local_variable instrução, para o valor especificado.
Transact-SQL convenções de sintaxe
Syntax
Sintaxe do SQL Server, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure:
SET
{ @local_variable
[ . { property_name | field_name } ] = { expression | udt_name { . | :: } method_name }
}
| { @SQLCLR_local_variable.mutator_method }
| { @local_variable
{ += | -= | *= | /= | %= | &= | ^= | |= } expression
}
| { @cursor_variable =
{ @cursor_variable | cursor_name
| { CURSOR [ [ LOCAL | GLOBAL ] ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ , ...n ] ] } ]
}
}
}
Sintaxe para o Azure Synapse Analytics e Parallel Data Warehouse e Microsoft Fabric:
SET @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression
Arguments
@local_variable
O nome de uma variável de qualquer tipo, exceto cursor, texto, ntext, imagem ou tabela. Os nomes das variáveis devem começar com um no sinal (@). Os nomes das variáveis devem seguir as regras para identificadores.
property_name
Uma propriedade de um tipo definido pelo usuário.
field_name
Um campo público de um tipo definido pelo usuário.
udt_name
O nome de um tipo definido pelo usuário do Common Language Runtime (CLR).
{ . | :: }
Especifica um método de um tipo de definição de usuário CLR. Para um método de instância (não estático), use um ponto (.). Para um método estático, use dois dois pontos (::). Para invocar um método, propriedade ou campo de um tipo definido pelo usuário CLR, você deve ter permissão EXECUTE no tipo.
method_name ( argumento [ ,... n ] )
Um método de um tipo definido pelo usuário que usa um ou mais argumentos para modificar o estado de uma instância de um tipo. Os métodos estáticos devem ser públicos.
@SQLCLR_local_variable
Uma variável cujo tipo está localizado em um assembly. Para obter mais informações, consulte Conceitos de programação de integração CLR (Common Language Runtime).
mutator_method
Um método no assembly que pode alterar o estado do objeto. SQLMethodAttribute.IsMutator é aplicado a esse método.
{ += | | -= | *= | /= | %= | &= | ^= | |= }
Operador de atribuição composta:
-
+=- Adicionar e atribuir -
-=- Subtrair e atribuir -
*=- Multiplicar e atribuir -
/=- Dividir e atribuir -
%=- Modulo e atribuir -
&=- BitwiseANDe atribuir -
^=- BitwiseXORe atribuir -
|=- BitwiseORe atribuir
expression
Qualquer expressão válida.
cursor_variable
O nome de uma variável de cursor. Se a variável do cursor de destino fez referência a um cursor diferente, essa referência anterior será removida.
cursor_name
O nome de um cursor declarado usando a DECLARE CURSOR instrução.
CURSOR
Especifica que a SET instrução contém uma declaração de um cursor.
ROLO
Especifica que o cursor suporta todas as opções de busca: FIRST, LAST, NEXT, PRIOR, RELATIVEe ABSOLUTE. Não é possível especificar SCROLL quando você também especifica FAST_FORWARD.
FORWARD_ONLY
Especifica que o cursor suporta apenas a FETCH NEXT opção. O cursor é recuperado apenas em uma direção, da primeira à última linha. Quando você especifica FORWARD_ONLY sem as STATICpalavras-chave , KEYSETou , o DYNAMIC cursor é implementado como DYNAMIC. Se você não especificar um ou FORWARD_ONLYSCROLL, FORWARD_ONLY é o padrão, a menos que especifique as palavras-chave STATIC, KEYSETou DYNAMIC. Para STATIC, KEYSET, e DYNAMIC cursores, SCROLL é o padrão.
ESTÁTICA
Define um cursor que faz uma cópia temporária dos dados a serem usados pelo cursor. Todas as solicitações para o cursor são respondidas a partir desta tabela temporária em tempdb. Como resultado, as modificações feitas nas tabelas base depois que o cursor é aberto não são refletidas nos dados retornados pelas buscas feitas no cursor. E este cursor não suporta modificações.
CONJUNTO DE CHAVES
Especifica que a associação e a ordem das linhas no cursor são corrigidas quando o cursor é aberto. O conjunto de chaves que identificam exclusivamente as linhas é incorporado no keysettable em tempdb. As alterações nos valores não-chave nas tabelas base, feitas pelo proprietário do cursor ou confirmadas por outros usuários, são visíveis à medida que o proprietário do cursor rola ao redor do cursor. As inserções feitas por outros usuários não são visíveis e as inserções não podem ser feitas por meio de um cursor do servidor Transact-SQL.
Se uma linha for excluída, uma tentativa de buscar a linha retornará um @@FETCH_STATUS de -2. As atualizações de valores de chave de fora do cursor são semelhantes a uma exclusão da linha antiga seguida por uma inserção da nova linha. A linha com os novos valores não está visível e tenta buscar a linha com os valores antigos retornando a @@FETCH_STATUS de -2. Os novos valores são visíveis se a atualização ocorrer através do cursor, especificando a WHERE CURRENT OF cláusula.
DINÂMICA
Define um cursor que reflete todas as alterações de dados feitas nas linhas em seu conjunto de resultados à medida que o proprietário do cursor rola ao redor do cursor. Os valores de dados, a ordem e a associação das linhas podem ser alterados em cada busca. As opções de busca absoluta e relativa não são suportadas com cursores dinâmicos.
FAST_FORWARD
Especifica um FORWARD_ONLYcursor , READ_ONLY com otimizações habilitadas.
FAST_FORWARD não pode ser especificado quando SCROLL também é especificado.
READ_ONLY
Impede que atualizações sejam feitas através deste cursor. O cursor não pode ser referenciado em uma WHERE CURRENT OF cláusula em uma UPDATE instrução or DELETE . Esta opção substitui a capacidade padrão de um cursor a ser atualizado.
FECHADURAS DE PERGAMINHO
Especifica que as atualizações posicionadas ou exclusões feitas através do cursor têm garantia de êxito. O SQL Server bloqueia as linhas à medida que são lidas no cursor para garantir sua disponibilidade para modificações posteriores. Não é possível especificar SCROLL_LOCKS quando FAST_FORWARD também é especificado.
OTIMISTA
Especifica que as atualizações posicionadas ou exclusões feitas através do cursor não terão êxito se a linha tiver sido atualizada desde que foi lida no cursor. O SQL Server não bloqueia linhas à medida que são lidas no cursor. Em vez disso, ele usa comparações de valores de coluna de carimbo de data/hora, ou um valor de soma de verificação, se a tabela não tiver coluna de carimbo de data/hora, para determinar se a linha foi modificada depois de ser lida no cursor. Se a linha foi modificada, a tentativa de atualização ou exclusão posicionada falhará. Não é possível especificar OPTIMISTIC quando FAST_FORWARD também é especificado.
TYPE_WARNING
Especifica que uma mensagem de aviso é enviada ao cliente quando o cursor é implicitamente convertido do tipo solicitado para outro.
PARA select_statement
Uma instrução padrão SELECT que define o conjunto de resultados do cursor. As palavras-chave FOR BROWSE, e INTO não são permitidas no select_statement de uma declaração de cursor.
Se você usar DISTINCT, UNION, GROUP BY, ou , ou HAVINGincluir uma expressão agregada no select_list, o cursor será criado como STATIC.
Se cada tabela subjacente não tiver um índice exclusivo e um cursor ISO SCROLL ou se for solicitado um cursor Transact-SQL KEYSET , o cursor será automaticamente um STATIC cursor.
Se select_statement contiver uma ORDER BY cláusula na qual as colunas não são identificadores de linha exclusivos, um DYNAMIC cursor será convertido em um KEYSET cursor ou em um STATIC cursor se um KEYSET cursor não puder ser aberto. Esse processo também ocorre para um cursor definido usando a sintaxe ISO, mas sem a STATIC palavra-chave.
SÓ LEITURA
Impede que atualizações sejam feitas através deste cursor. O cursor não pode ser referenciado em uma WHERE CURRENT OF cláusula em uma UPDATE instrução or DELETE . Esta opção substitui a capacidade padrão de um cursor a ser atualizado. Esta palavra-chave varia da anterior READ_ONLY por ter um espaço em vez de um sublinhado entre READ e ONLY.
ATUALIZAÇÃO [ DE column_name [ ,... n ] ]
Define colunas atualizáveis dentro do cursor. Se OF <column_name> [ , ...n ] for fornecido, apenas as colunas listadas permitem modificações. Quando nenhuma lista é fornecida, todas as colunas podem ser atualizadas, a menos que o cursor seja definido como READ_ONLY.
Remarks
Depois que uma variável é declarada, ela é inicializada como NULL. Use a SET instrução para atribuir um valor que não NULL seja a uma variável declarada. A SET instrução que atribui um valor à variável retorna um único valor. Ao inicializar várias variáveis, use uma instrução separada SET para cada variável local.
Você pode usar variáveis somente em expressões, não em vez de nomes de objetos ou palavras-chave. Para construir instruções Transact-SQL dinâmicas, use EXECUTE.
Embora as regras de sintaxe para SET @cursor_variable incluir as LOCAL palavras-chave e GLOBAL , quando você usa a SET @cursor_variable = CURSOR... sintaxe, o cursor é criado como GLOBAL ou LOCAL, dependendo da configuração da opção padrão para banco de dados de cursor local.
As variáveis do cursor são sempre locais, mesmo que façam referência a um cursor global. Quando uma variável de cursor faz referência a um cursor global, o cursor tem uma referência de cursor global e uma referência local. Para obter mais informações, consulte Exemplo D, Usar SET com um cursor global.
Para obter mais informações, consulte DECLARE CURSOR (Transact-SQL).
Você pode usar o operador de atribuição composta em qualquer lugar que tenha uma atribuição com uma expressão no lado direito do operador, incluindo variáveis, e uma instrução SET, UPDATEe SELECT .RECEIVE
Não use uma variável em uma SELECT instrução para concatenar valores (ou seja, para calcular valores agregados). Resultados de consulta inesperados podem ocorrer porque todas as expressões na SELECT lista (incluindo atribuições) não são necessariamente executadas exatamente uma vez para cada linha de saída. Para obter mais informações, consulte KB 287515.
Permissions
Requer a participação na função pública. Todos os usuários podem usar SET @local_variableo .
Examples
Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que pode ser descarregado da página inicial de Exemplos e Projetos da Comunidade do Microsoft SQL Server.
A. Imprimir o valor de uma variável inicializada usando SET
O exemplo a seguir cria a @myVar variável, coloca um valor de cadeia de caracteres na variável e imprime o valor da @myVar variável.
DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT @myVar;
GO
B. Usar uma variável local atribuída a um valor usando SET em uma instrução SELECT
O exemplo a seguir cria uma variável local chamada @state e usa a variável local em uma SELECT instrução para localizar o primeiro nome (FirstName) e o nome da família (LastName) de todos os funcionários que vivem no estado de Oregon.
USE AdventureWorks2022;
GO
DECLARE @state CHAR(25);
SET @state = N'Oregon';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, City
FROM HumanResources.vEmployee
WHERE StateProvinceName = @state;
GO
C. Usar uma atribuição composta para uma variável local
Os dois exemplos seguintes produzem o mesmo resultado. Cada exemplo cria uma variável local chamada @NewBalance, multiplica-a por 10e, em seguida, exibe o novo valor da variável local em uma SELECT instrução. O segundo exemplo usa um operador de atribuição composta.
/* Example one */
DECLARE @NewBalance INT;
SET @NewBalance = 10;
SET @NewBalance = @NewBalance * 10;
SELECT @NewBalance;
GO
/* Example Two */
DECLARE @NewBalance INT = 10;
SET @NewBalance *= 10;
SELECT @NewBalance;
GO
D. Usar SET com um cursor global
O exemplo a seguir cria uma variável local e, em seguida, define a variável cursor como o nome do cursor global.
DECLARE my_cursor CURSOR GLOBAL
FOR SELECT * FROM Purchasing.ShipMethod
DECLARE @my_variable CURSOR ;
SET @my_variable = my_cursor ;
--There is a GLOBAL cursor declared(my_cursor) and a LOCAL variable
--(@my_variable) set to the my_cursor cursor.
DEALLOCATE my_cursor;
GO
--There is now only a LOCAL variable reference
--(@my_variable) to the my_cursor cursor.
E. Definir um cursor usando SET
O exemplo a seguir usa a SET instrução para definir um cursor.
DECLARE @CursorVar CURSOR;
SET @CursorVar = CURSOR SCROLL DYNAMIC
FOR
SELECT LastName, FirstName
FROM AdventureWorks2022.HumanResources.vEmployee
WHERE LastName like 'B%';
OPEN @CursorVar;
FETCH NEXT FROM @CursorVar;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM @CursorVar
END;
CLOSE @CursorVar;
DEALLOCATE @CursorVar;
GO
F. Atribuir um valor a partir de uma consulta
O exemplo a seguir usa uma consulta para atribuir um valor a uma variável.
USE AdventureWorks2022;
GO
DECLARE @rows INT;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;
GO
G. Atribuir um valor a uma variável de tipo definida pelo usuário modificando uma propriedade do tipo
O exemplo a seguir define um valor para o tipo definido pelo usuário (UDT) Point modificando o valor da propriedade X do tipo.
DECLARE @p Point;
SET @p.X = @p.X + 1.1;
SELECT @p;
GO
Saiba mais sobre como criar o Point UDT referenciado neste exemplo e os exemplos a seguir no artigo Criando tipos de User-Defined.
H. Atribua um valor a uma variável de tipo definida pelo usuário invocando um método do tipo
O exemplo a seguir define um valor para ponto de tipo definido pelo usuário invocando o método SetXY do tipo.
DECLARE @p Point;
SET @p=point.SetXY(23.5, 23.5);
I. Criar uma variável para um tipo CLR e chamar um método mutador
O exemplo a seguir cria uma variável para o tipo Pointe, em seguida, executa um método mutador em Point.
CREATE ASSEMBLY mytest FROM 'c:\test.dll' WITH PERMISSION_SET = SAFE
CREATE TYPE Point EXTERNAL NAME mytest.Point
GO
DECLARE @p Point = CONVERT(Point, '')
SET @p.SetXY(22, 23);
Exemplos: Azure Synapse Analytics and Analytics Platform System (PDW)
Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que pode ser descarregado da página inicial de Exemplos e Projetos da Comunidade do Microsoft SQL Server.
J. Imprimir o valor de uma variável inicializada usando SET
O exemplo a seguir cria a @myVar variável, coloca um valor de cadeia de caracteres na variável e imprime o valor da @myVar variável.
DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT TOP 1 @myVar FROM sys.databases;
K. Usar uma variável local atribuída a um valor usando SET em uma instrução SELECT
O exemplo a seguir cria uma variável local chamada @dept e usa essa variável local em uma SELECT instrução para localizar o primeiro nome (FirstName) e o nome da família (LastName) de todos os funcionários que trabalham no Marketing departamento.
DECLARE @dept CHAR(25);
SET @dept = N'Marketing';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name
FROM DimEmployee
WHERE DepartmentName = @dept;
L. Usar uma atribuição composta para uma variável local
Os dois exemplos seguintes produzem o mesmo resultado. Eles criam uma variável local chamada @NewBalance, multiplica-a por 10 e exibe o novo valor da variável local em uma SELECT instrução. O segundo exemplo usa um operador de atribuição composta.
/* Example one */
DECLARE @NewBalance INT;
SET @NewBalance = 10;
SET @NewBalance = @NewBalance * 10;
SELECT TOP 1 @NewBalance
FROM sys.tables;
/* Example Two */
DECLARE @NewBalance INT = 10;
SET @NewBalance *= 10;
SELECT TOP 1 @NewBalance
FROM sys.tables;
M. Atribuir um valor a partir de uma consulta
O exemplo a seguir usa uma consulta para atribuir um valor a uma variável.
-- Uses AdventureWorks
DECLARE @rows INT;
SET @rows = (SELECT COUNT(*) FROM dbo.DimCustomer);
SELECT TOP 1 @rows FROM sys.tables;