Instruções SET (Transact-SQL)
A linguagem de programação Transact-SQL fornece várias instruções SET que alteram a sessão atual que controla informações específicas. As instruções SET são agrupadas nas categorias mostradas na tabela a seguir.
Para obter informações sobre como definir variáveis locais usando uma instrução SET, consulte SET @local\_variable (Transact-SQL).
Categoria |
Instruções |
||
---|---|---|---|
Instruções de data e hora |
|||
Instruções de bloqueio |
|||
Instruções diversas |
|||
Instruções de execução de consulta |
|
||
Instruções de configurações ISO |
|||
Instruções estatísticas |
|||
Instruções de transações |
Considerações sobre quando usar instruções SET
Todas as instruções SET são implementadas na execução ou em tempo de execução para SET FIPS_FLAGGER, SET OFFSETS, SET PARSEONLY e SET QUOTED_IDENTIFIER. Essas instruções são implementadas no momento da análise.
Se uma instrução SET for executada em um procedimento armazenado ou disparador, seu valor será restaurado depois que o controle for retornado do procedimento armazenado ou disparador. Além disso, se uma instrução SET for especificada em uma cadeia de caracteres SQL dinâmica que seja executada usando sp_executesql ou EXECUTE, o valor da opção SET é restaurado depois que o controle é retornado do lote especificado na cadeia de caracteres SQL.
Os procedimentos armazenados são executados com as configurações SET especificadas no momento da execução, com exceção de SET ANSI_NULLS e SET QUOTED_IDENTIFIER. Os procedimentos armazenados que especificam que SET ANSI_NULLS ou SET QUOTED_IDENTIFIER usam a configuração especificada no momento da criação do procedimento armazenado. Se usada em um procedimento armazenado, qualquer configuração SET será ignorada.
A configuração user options de sp_configure permite configurações em todo o servidor e trabalhos em vários bancos de dados. Essa configuração também se comporta como uma instrução SET explícita, a não ser que ocorra no momento de logon.
As configurações de banco de dados definidas usando ALTER DATABASE só são válidas em nível do banco de dados e entram em vigor apenas quando definidas explicitamente. As configurações de banco de dados substituem as configurações de opção de instância que são definidas usando sp_configure.
Para qualquer instrução SET com as configurações ON e OFF, é possível especificar uma configuração ON ou OFF para várias opções SET.
Observação Isso não se aplica às estatísticas relacionadas às opções SET.
Por exemplo, SET QUOTED_IDENTIFIER, ANSI_NULLS ON define QUOTED_IDENTIFIER e ANSI_NULLS como ON.
As configurações da instrução SET substituem as configurações de opção de banco de dados equivalentes que são definidas usando ALTER DATABASE. Por exemplo, o valor especificado em uma instrução SET ANSI_NULLS substituirá a configuração de banco de dados por ANSI_NULLs. Além disso, algumas configurações de conexão são definidas automaticamente como ON quando um usuário se conecta a um banco de dados com base nos valores especificados pelo uso anterior da configuração de sp_configure user options ou dos valores que se aplicam a todas as conexões ODBC e OLE/DB.
Instruções ALTER, CREATE e DROP DATABASE não aceitam a configuração SET LOCK_TIMEOUT.
Quando uma instrução SET global ou de atalho, como SET ANSI_DEFAULTS, define várias configurações, emitindo o atalho, a instrução SET redefine as configurações anteriores por todas as opções afetadas pela instrução SET de atalho. Se uma opção SET individual que é afetada por uma instrução SET de atalho for explicitamente definida depois que a instrução SET é emitida, a instrução SET individual substitui as configurações de atalho correspondentes.
Quando lotes são usados, o contexto de banco de dados é determinado pelo lote estabelecido usando a instrução USE. Consultas ad hoc e todas as outras instruções que são executadas fora do procedimento armazenado e que são lotes herdam as configurações de opção do banco de dados e a conexão estabelecida pela instrução USE.
Solicitações MARS (Vários Conjuntos de Resultados Ativos) compartilham um estado global que contém as configurações de opção SET da sessão mais recente. Quando é executada, cada solicitação pode modificar as opções SET. As alterações são específicas do contexto de solicitação no qual elas foram definidas e não afetam outras solicitações MARS simultâneas. Entretanto, depois que a execução da solicitação é concluída, as novas opções SET são copiadas para o estado de sessão global. As novas solicitações executadas na mesma sessão depois dessa alteração usarão essas novas configurações de opção SET.
Quando um procedimento armazenado é executado, seja de um lote ou de outro procedimento armazenado, ele é executado nos valores de opção atualmente definidos no banco de dados que contém o procedimento armazenado. Por exemplo, quando o procedimento armazenado db1.dbo.sp1 chama o procedimento armazenado db2.dbo.sp2, o procedimento armazenado sp1 é executado na configuração de nível de compatibilidade atual do banco de dados db1 e o procedimento armazenado sp2 é executado na configuração de nível de compatibilidade atual do banco de dados db2.
Quando uma instrução Transact-SQL se refere a objetos que residem em vários bancos de dados, o contexto de banco de dados atual e o contexto de conexão atual se aplicam a essa instrução. Nesse caso, se a instrução Transact-SQL estiver em um lote, o contexto de conexão atual será o banco de dados definido pela instrução USE; se a instrução Transact-SQL estiver em um procedimento armazenado, o contexto de conexão será o banco de dados que contém o procedimento armazenado.
Ao criar e manipular índices em colunas computadas ou exibições indexadas, as opções SET ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER, ANSI_NULLS, ANSI_PADDING e ANSI_WARNINGS devem ser definidas como ON. A opção NUMERIC_ROUNDABORT deve ser definida como OFF.
Se qualquer uma dessas opções não for definida com os valores solicitados, haverá falha nas ações INSERT, UPDATE, DELETE, DBCC CHECKDB e DBCC CHECKTABLE em exibições ou tabelas indexadas com índices em colunas computadas. O SQL Server gerará um erro que lista todas as opções definidas incorretamente. Além disso, o SQL Server processará as instruções SELECT nessas tabelas ou exibições indexadas como se os índices nas colunas computadas ou nas exibições não existissem.