Partilhar via


Conjuntos de linhas e cursores do SQL Server

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure do Azure Synapse AnalyticsAnalytics Platform System (PDW)

Baixar driver OLE DB

O SQL Server retorna conjuntos de resultados aos consumidores usando dois métodos:

  • O resultado padrão define que:

    • Minimize as despesas gerais.

    • Forneça o máximo desempenho na busca de dados.

    • Suporta apenas a funcionalidade de cursor padrão somente encaminhamento e somente leitura.

    • Devolver linhas ao consumidor uma linha de cada vez.

    • Ofereça suporte a apenas uma instrução ativa de cada vez em uma conexão.

      Após a execução de uma declaração, nenhuma outra declaração poderá ser executada na conexão até que todos os resultados tenham sido recuperados pelo consumidor ou a declaração tenha sido cancelada.

    • Apoie todas as Transact-SQL declarações.

  • Cursores de servidor que:

    • Suporta todas as funcionalidades do cursor.

    • Pode devolver blocos de linhas ao consumidor.

    • Ofereça suporte a várias instruções ativas em uma única conexão.

    • Equilibre a funcionalidade do cursor em relação ao desempenho.

      O suporte para a funcionalidade do cursor pode diminuir o desempenho em relação a um conjunto de resultados padrão. Isso pode ser deslocado se o consumidor puder usar a funcionalidade do cursor para recuperar um conjunto menor de linhas.

    • Não ofereça suporte a nenhuma instrução Transact-SQL que retorne mais de um único conjunto de resultados.

Os consumidores podem solicitar diferentes comportamentos de cursor em um conjunto de linhas definindo determinadas propriedades do conjunto de linhas. Se o consumidor não definir nenhuma dessas propriedades de conjunto de linhas ou defini-las todas com seus valores padrão, o Driver OLE DB para SQL Server implementará o conjunto de linhas usando um conjunto de resultados padrão. Se qualquer uma dessas propriedades estiver definida como um valor diferente do padrão, o driver OLE DB para SQL Server implementará o conjunto de linhas usando um cursor de servidor.

As propriedades do conjunto de linhas a seguir direcionam o driver OLE DB para SQL Server para usar cursores do SQL Server. Algumas propriedades podem ser combinadas com segurança com outras. Por exemplo, um conjunto de linhas que exibe as propriedades DBPROP_IRowsetScroll e DBPROP_IRowsetChange será um conjunto de linhas de indicador exibindo comportamento de atualização imediata. Outras propriedades são mutuamente exclusivas. Por exemplo, um conjunto de linhas exibindo DBPROP_OTHERINSERT não pode conter marcadores.

ID do imóvel Valor Comportamento do conjunto de linhas
DBPROP_SERVERCURSOR VARIANT_TRUE Não é possível atualizar dados do SQL Server por meio do conjunto de linhas. O conjunto de linhas é sequencial, suportando apenas rolagem e busca para frente. O posicionamento relativo da linha é suportado. O texto do comando pode conter uma cláusula ORDER BY.
DBPROP_CANSCROLLBACKWARDS ou DBPROP_CANFETCHBACKWARDS VARIANT_TRUE Não é possível atualizar dados do SQL Server por meio do conjunto de linhas. O conjunto de linhas suporta rolagem e busca em qualquer direção. O posicionamento relativo da linha é suportado. O texto do comando pode conter uma cláusula ORDER BY.
DBPROP_BOOKMARKS ou DBPROP_LITERALBOOKMARKS VARIANT_TRUE Não é possível atualizar dados do SQL Server por meio do conjunto de linhas. O conjunto de linhas é sequencial, suportando apenas rolagem e busca para frente. O posicionamento relativo da linha é suportado. O texto do comando pode conter uma cláusula ORDER BY.
DBPROP_OWNUPDATEDELETE ou DBPROP_OWNINSERT ou DBPROP_OTHERUPDATEDELETE VARIANT_TRUE Não é possível atualizar dados do SQL Server por meio do conjunto de linhas. O conjunto de linhas suporta rolagem e busca em qualquer direção. O posicionamento relativo da linha é suportado. O texto do comando pode conter uma cláusula ORDER BY.
DBPROP_OTHERINSERT VARIANT_TRUE Não é possível atualizar dados do SQL Server por meio do conjunto de linhas. O conjunto de linhas suporta rolagem e busca em qualquer direção. O posicionamento relativo da linha é suportado. O texto do comando pode incluir uma cláusula ORDER BY se existir um índice nas colunas referenciadas.

DBPROP_OTHERINSERT não pode ser VARIANT_TRUE se o conjunto de linhas contiver marcadores. Tentar criar um conjunto de linhas com essa propriedade de visibilidade e marcadores causa um erro.
DBPROP_IRowsetLocate ou DBPROP_IRowsetScroll VARIANT_TRUE Não é possível atualizar dados do SQL Server por meio do conjunto de linhas. O conjunto de linhas suporta rolagem e busca em qualquer direção. Marcadores e posicionamento absoluto através da interface IRowsetLocate são suportados no conjunto de linhas. O texto do comando pode conter uma cláusula ORDER BY.

DBPROP_IRowsetLocate e DBPROP_IRowsetScroll exigem marcadores no conjunto de linhas. Tentar criar um conjunto de linhas com marcadores e DBPROP_OTHERINSERT definido como VARIANT_TRUE causa um erro.
DBPROP_IRowsetChange ou DBPROP_IRowsetUpdate VARIANT_TRUE Pode atualizar dados do SQL Server por meio do conjunto de linhas. O conjunto de linhas é sequencial, suportando apenas rolagem e busca para frente. O posicionamento relativo da linha é suportado. Todos os comandos que suportam cursores atualizáveis podem suportar essas interfaces.
DBPROP_IRowsetLocate ou DBPROP_IRowsetScroll e DBPROP_IRowsetChange ou DBPROP_IRowsetUpdate VARIANT_TRUE Pode atualizar dados do SQL Server por meio do conjunto de linhas. O conjunto de linhas suporta rolagem e busca em qualquer direção. Marcadores e posicionamento absoluto através IRowsetLocate são suportados no conjunto de linhas. O texto do comando pode conter uma cláusula ORDER BY.
DBPROP_IMMOBILEROWS VARIANT_FALSE Não é possível atualizar dados do SQL Server por meio do conjunto de linhas. O conjunto de linhas suporta apenas rolagem para frente. O posicionamento relativo da linha é suportado. O texto do comando pode incluir uma cláusula ORDER BY se existir um índice nas colunas referenciadas.

DBPROP_IMMOBILEROWS só está disponível em conjuntos de linhas que podem mostrar linhas do SQL Server inseridas por comandos em outras sessões ou por outros usuários. Tentar abrir um conjunto de linhas com a propriedade definida como VARIANT_FALSE em qualquer conjunto de linhas para o qual DBPROP_OTHERINSERT não pode ser VARIANT_TRUE causa um erro.
DBPROP_REMOVEDELETED VARIANT_TRUE Não é possível atualizar dados do SQL Server por meio do conjunto de linhas. O conjunto de linhas suporta apenas rolagem para frente. O posicionamento relativo da linha é suportado. O texto do comando pode conter uma cláusula ORDER BY, a menos que seja restringido por outra propriedade.

Um conjunto de linhas do Driver OLE DB para SQL Server suportado por um cursor de servidor pode ser facilmente criado em uma tabela base ou exibição do SQL Server usando o método IOpenRowset::OpenRowset. Especifique a tabela ou exibição por nome, passando os conjuntos de propriedades de conjunto de linhas necessários no parâmetro rgPropertySets .

O texto de comando que cria um conjunto de linhas é restrito quando o consumidor exige que o conjunto de linhas seja suportado por um cursor de servidor. Especificamente, o texto do comando é restrito a uma única instrução SELECT que retorna um único resultado de conjunto de linhas ou a um procedimento armazenado que implementa uma única instrução SELECT retornando um único resultado de conjunto de linhas.

Essas duas tabelas mostram os mapeamentos de várias propriedades OLE DB e os modelos de cursor. Eles também mostram quais propriedades do conjunto de linhas devem ser definidas para usar um determinado tipo de modelo de cursor.

Cada célula na tabela contém um valor da propriedade rowset para o modelo de cursor específico. O tipo de dados de todas as propriedades do conjunto de linhas listadas anteriormente neste tópico é VT_BOOL e o valor padrão é VARIANT_FALSE. Os seguintes símbolos são usados na tabela.

F = valor padrão (VARIANT_FALSE)

T = VARIANT_TRUE

- = VARIANT_TRUE ou VARIANT_FALSE

Para usar um determinado tipo de modelo de cursor, localize a coluna correspondente ao modelo de cursor e encontre todas as propriedades do conjunto de linhas com o valor 'T' na coluna. Defina essas propriedades de conjunto de linhas como VARIANT_TRUE usar o modelo de cursor específico. As propriedades do conjunto de linhas com '-' como um valor podem ser definidas como VARIANT_TRUE ou VARIANT_FALSE.

Propriedades do conjunto de linhas/modelos de cursor Inadimplência

Resultado

conjunto

(RO)
Rápido

para a frente-

apenas

(RO)
Estática

(RO)
Conjunto de chaves

conduzido

(RO)
DBPROP_SERVERCURSOR F T T T
DBPROP_DEFERRED F F - -
DBPROP_IrowsetChange F F F F
DBPROP_IrowsetLocate F F - -
DBPROP_IrowsetScroll F F - -
DBPROP_IrowsetUpdate F F F F
DBPROP_BOOKMARKS F F - -
DBPROP_CANFETCHBACKWARDS F F - -
DBPROP_CANSCROLLBACKWARDS F F - -
DBPROP_CANHOLDROWS F F - -
DBPROP_LITERALBOOKMARKS F F - -
DBPROP_OTHERINSERT F T F F
DBPROP_OTHERUPDATEDELETE F T F T
DBPROP_OWNINSERT F T F T
DBPROP_OWNUPDATEDELETE F T F T
DBPROP_QUICKSTART F F - -
DBPROP_REMOVEDELETED F F F -
DBPROP_IrowsetResynch F F F -
DBPROP_CHANGEINSERTEDROWS F F F F
DBPROP_SERVERDATAONINSERT F F F -
DBPROP_UNIQUEROWS - F F F
DBPROP_IMMOBILEROWS - - - T
Propriedades do conjunto de linhas/Modelos de cursor Dinâmica (RO) Conjunto de chaves (R/W) Dinâmico (R/W)
DBPROP_SERVERCURSOR T T T
DBPROP_DEFERRED - - -
DBPROP_IrowsetChange F - -
DBPROP_IrowsetLocate F - F
DBPROP_IrowsetScroll F - F
DBPROP_IrowsetUpdate F - -
DBPROP_BOOKMARKS F - F
DBPROP_CANFETCHBACKWARDS - - -
DBPROP_CANSCROLLBACKWARDS - - -
DBPROP_CANHOLDROWS F - F
DBPROP_LITERALBOOKMARKS F - F
DBPROP_OTHERINSERT T F T
DBPROP_OTHERUPDATEDELETE T T T
DBPROP_OWNINSERT T T T
DBPROP_OWNUPDATEDELETE T T T
DBPROP_QUICKSTART - - -
DBPROP_REMOVEDELETED T - T
DBPROP_IrowsetResynch - - -
DBPROP_CHANGEINSERTEDROWS F - F
DBPROP_SERVERDATAONINSERT F - F
DBPROP_UNIQUEROWS F F F
DBPROP_IMMOBILEROWS F T F

Para um conjunto específico de propriedades de conjunto de linhas, o modelo de cursor selecionado é determinado da seguinte maneira.

A partir da coleção especificada de propriedades do conjunto de linhas, obtenha um subconjunto de propriedades listadas nas tabelas anteriores. Divida essas propriedades em dois subgrupos, dependendo do valor do sinalizador obrigatório (T, F) ou opcional (-)- de cada propriedade do conjunto de linhas. Para cada modelo de cursor, comece na primeira tabela e mova-se da esquerda para a direita. Compare os valores das propriedades nos dois subgrupos com os valores das propriedades correspondentes nessa coluna. O modelo de cursor que não tem nenhuma incompatibilidade com as propriedades necessárias e o menor número de incompatibilidades com as propriedades opcionais é selecionado. Se houver mais de um modelo de cursor, o mais à esquerda é escolhido.

Tamanho do bloco de cursor do SQL Server

Quando um cursor do SQL Server dá suporte a um conjunto de linhas do Driver OLE DB para SQL Server, o número de elementos no parâmetro de matriz de identificador de linha do IRowset::GetNextRows ou o IRowsetLocate::GetRowsAt métodos define o tamanho do bloco de cursor. As linhas indicadas pelas alças na matriz são os membros do bloco de cursor.

Para conjuntos de linhas que suportam marcadores, as alças de linha recuperadas usando o método IRowsetLocate::GetRowsByBookmark definem os membros do bloco de cursor.

Independentemente do método usado para preencher o conjunto de linhas e formar o bloco de cursor do SQL Server, o bloco de cursor fica ativo até que o próximo método de busca de linhas seja executado no conjunto de linhas.

Ver também

Conjuntos de linhas