AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / 问题

Perguntas[sql-server-2005](dba)

Martin Hope
MrVimes
Asked: 2022-07-15 04:47:12 +0800 CST

Qualquer coisa, exceto pequenas consultas ODBC que falham em VPN de longa distância após o SQL Server Swap

  • 0

Recentemente, troquei os servidores de banco de dados (bancos de dados restaurados do antigo para o novo e depois troquei os IPs) ...

Antigo: Sql Server 2005, Windows Server 2003 Novo: Sql Server 2008, Windows Server 2012

Todos os processos que se conectam ao servidor (site dot net, PHP, vbscript, mssql) de uma VPN geograficamente próxima funcionam bem no novo servidor.

Mas temos uma VPN entre o servidor (UK) e um escritório satélite (KY USA) e um aplicativo de banco de dados em execução no Microsoft Access, e esse aplicativo está gerando um erro ao realizar consultas no novo servidor. O erro é....

Erro: ODBC--falha na chamada.

[Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionRead (recv()). (#10054) [Microsoft][ODBC SQL Server Driver][DBNETLIB]Erro geral de rede. Verifique a documentação da sua rede. (#11)

Se eu tiver temporariamente esse aplicativo consultando o servidor antigo (alterando o arquivo hosts local) o erro não ocorre e tudo funciona.

Para ajudar na solução de problemas, criei um pequeno script ...

'ConString="Provider=SQLOLEDB;Data Source=172.17.201.11,1433;" & _
'   "OLE DB Services=-2;Initial Catalog=Perf;Network=DBMSSOCN;User Id=*;Password=*"

ConString="Provider=SQLOLEDB;Data Source=172.17.201.11,1433;" & _
    "Initial Catalog=Perf;Network=DBMSSOCN;User Id=*;Password=*"
    set conn = CreateObject("ADODB.Connection") 
    
Conn.connectiontimeout=500
Conn.commandtimeout=500
conn.open ConString

SCRIPTTIMEOUT = 1000

'sqlstring="SELECT top 100 ClientID FROM Clients"
sqlstring="SELECT top 1000 ClientID FROM Clients"
'sqlstring="SELECT ClientID FROM Clients"

'succeeds with top 100
'fails with top 1000 or no limit


set Rcount = Conn.Execute(sqlstring)

msgbox Rcount(0)

Rcount.Close
set Rcount = Nothing

set sqlstring = Nothing
Conn.Close
set Conn = Nothing

O script funciona se eu consultar 100 linhas. Se eu tentar 1000, ele falha todas as vezes (eu não tentei quantidades intermediárias, mas não vejo muito sentido em reduzi-lo)

O script funciona se eu mudar o endereço IP para o servidor antigo (todo o resto é o mesmo - mesma vpn, mesmo cliente, mesmo script)

O script e o aplicativo de acesso funcionam bem em todos os sentidos em uma VPN diferente (também no Reino Unido)

  • Eu vasculhei todas as configurações que posso encontrar em cada servidor (no MS SQL Studio, Configuration Manager, Network Settings) para tentar corresponder e experimentar configurações diferentes.
  • Eu parei e iniciei serviços
  • Eu pesquisei isso e tentei todas as sugestões que pude encontrar (perdi o controle, mas tentei adicionar OLE DB Services=-2. Tentei Encrypt=on(e desativei). Tentei Trusted_connection=on(e desativei). Tentei Pooling=on(e desativei). tentei especificar o nome da instância após o IP.

Ambos os servidores estão no mesmo rack físico, na mesma rede/sub-rede, conectados ao mesmo switch físico.

Antes de seguir o caminho de mexer nas configurações da VPN, trocar os fios (exigindo acesso ao DC), há algo que eu possa/deveria fazer/olhar no novo servidor para ajudar?

Edit: Se eu adicionar Packet Size=1024;à minha string de conexão, funciona! O problema é que ambos os servidores têm definido como 4096 por padrão, e o servidor antigo funciona bem com isso.

Editar 2 O acima funcionou para o meu script de teste, mas não para o aplicativo de acesso.

Espero encontrar uma solução alternativa que não exija uma alteração da cadeia de conexão porque isso será um aborrecimento (envolvendo o desenvolvedor do aplicativo de acesso)

sql-server-2008 sql-server-2005
  • 1 respostas
  • 88 Views
Martin Hope
Kristina Kristina
Asked: 2020-02-18 06:38:20 +0800 CST

Como fazer intervalos de datas a partir de uma lista de datas

  • 0

Como fazer intervalos de datas a partir de uma lista de datas (Agrupe pelas colunas A e C, o intervalo de datas consiste em uma sequência de datas contínua):

insira a descrição da imagem aqui

sql-server sql-server-2005
  • 1 respostas
  • 71 Views
Martin Hope
MrVimes
Asked: 2020-01-08 04:11:55 +0800 CST

Junte-se a um valor 'padrão' somente quando não houver nenhum registro totalmente correspondente

  • 1

Eu preciso ser capaz de ingressar em uma linha 'padrão' em uma tabela (tabela direita) somente quando não houver registro correspondente para ambos os campos na tabela esquerda. Abaixo está o conteúdo bruto das tabelas

#lefttable
--------------------
value  program  race
100    gold     1
100    gold     4
100    gold     5


#righttable
-------------------------
commission  program  race
14          GOLD     1
23          GOLD     NULL

Neste exemplo, onde a corrida é 1, preciso escolher a primeira linha (comissão = 14), mas se a corrida for diferente de 1, preciso escolher a linha NULL que corresponde ao outro campo (comissão = 23)

O problema que estou tendo é que minha consulta escolhe o registro nulo e o registro correspondente ao ingressar, resultando em duplicação ...

SELECT #lefttable.race,
       totalvalue = SUM(value),
       commission = SUM(value * (commission * 0.01))
  FROM #lefttable
  LEFT JOIN #righttable  ON #lefttable.program = #righttable.program
                        AND #lefttable.race = ISNULL(#righttable.race, #lefttable.race)
 GROUP BY #lefttable.race;

Isso resulta no abaixo

--------------------
race  totalvalue  commission
1     200         37.00
3     100         23.00
4     100         23.00

O valor total é o dobro do que deveria ser (e comissão incorreta) porque a junção criou duas linhas para a corrida 1 (uma para cada linha na tabela direita)

Idealmente, eu quero ser capaz de resolver esse problema inteiramente dentro da cláusula join, em vez de ter que adicionar cluds confusos à cláusula select, ou junções adicionais, ou visualizações, ou modificar righttable para criar uma linha para cada corrida, independentemente.

Eu tentei diferentes maneiras de construir a cláusula join, mas não consigo entender como dizer "Dê-me a linha com a corrida nula somente se não houver nenhuma linha que corresponda à corrida na tabela esquerda" usando uma junção sql.

Isso é possível?

sql-server-2005
  • 1 respostas
  • 1935 Views
Martin Hope
Jack Casas
Asked: 2019-03-27 02:57:08 +0800 CST

Enterprise SQL 2005 de 32 bits no Windows 2008 Server Standard de 64 bits. Configuração de memória

  • 1

Trabalhando em um projeto, precisamos primeiro estabilizar e depois atualizar.

Temos uma edição Enterprise de 32 bits do SQL Server 2005 instalado em um servidor padrão do Windows 2008 de 64 bits.

O servidor possui 64 GB de RAM instalados, porém no taskmgr existem apenas 32 GB disponíveis. Acredito que seja uma limitação padrão do Windows Server, só quero confirmar.

insira a descrição da imagem aqui

Por outro lado, verificamos os contadores de memória do SQL Server no perfmon, e o valor que obtemos para o destino e a memória total é de cerca de 3.500.000, então acho que o SQL Server está usando cerca de 3,5 GB??

insira a descrição da imagem aqui

Quero perguntar sobre as configurações que precisamos fazer para que o SQL Server use o máximo de memória possível, espero que 28 GB, deixando 4 GB para SO, pois não temos outros serviços nesta máquina.

Isso é o que estou planejando até agora, mas como é um ambiente de produção, o ideal seria tentar acertar em uma tentativa, porque não quero parar os serviços muitas vezes:

  • A conta de serviço é Sistema Local, mas não consigo ver "Usando páginas bloqueadas para pool de buffers" nos logs do SQL Server. Preciso mudar para outra conta de usuário para aproveitar a política de "bloquear páginas na memória"? O que posso ver no log do SQL Server é o seguinte: "Usando alocação dinâmica de bloqueio. Alocação inicial de 2.500 blocos de bloqueio e 5.000 blocos de proprietário de bloqueio por nó. Esta é uma mensagem apenas informativa. Nenhuma ação do usuário é necessária."

  • A propriedade de memória máxima do servidor é definida como 10240; Acho que depois de habilitar as páginas de bloqueio na memória, precisarei aumentar isso para 28000

  • Como este é um sistema operacional de 64 bits, não há necessidade de ativar o AWE. No entanto, no log do servidor SQL, posso ver esta mensagem: "Set AWE Enabled to 1 nos parâmetros de configuração para permitir o uso de mais memória".

Mais alguma coisa que preciso levar em consideração para habilitar mais memória para o SQL Server??

sql-server-2005 performance
  • 1 respostas
  • 140 Views
Martin Hope
Kevin H
Asked: 2019-01-11 05:31:14 +0800 CST

Criar trabalho SQL para enviar e-mail no formato Excel

  • 1

Eu não sou hábil em SQL e preciso de alguma ajuda. Tenho um servidor SQL2005 e criei um job para enviar um email com um anexo CSV. Meu trabalho funciona bem, mas preciso que o resultado final seja um arquivo do Excel no formato .xls ou .xlsx.

Segue o código do trabalho:

USE My_DB
GO

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'DBMail'
    ,@recipients =  'me@my_org.com' 
    ,@copy_recipients = ''
    ,@execute_query_database = 'My_DB'
    ,@query = 'exec MY_RPT_MonthlyWIPSp'
    --@body =@bodyContent
    ,@subject = 'Monthly WIP Report'
    ,@attach_query_result_as_file = 1
    ,@query_attachment_filename = 'result.csv'
    ,@query_result_separator=',',@query_result_width =32767
    ,@query_result_no_padding=1;

O que eu preciso mudar e onde conseguir que os dados saiam no formato que eu preciso? Tenho que modificar meu SP?

sql-server-2005
  • 1 respostas
  • 4880 Views
Martin Hope
Lee Hill
Asked: 2018-09-18 00:42:40 +0800 CST

Os VLFs do log de transações do SQL Server não estão sendo liberados (Status 2) no banco de dados de log enviado

  • 2

Vi alguns posts semelhantes ao meu cenário, mas nada que realmente resolva meu problema.

Cenário:

  • A reconstrução de índice de rotina acontece, uma vez por semana, às 2h da manhã de sábado.
  • O arquivo de log cresce cerca de 15x o tamanho normal.
  • O backup do log de transações é feito (a cada 10 minutos, 24 horas por dia, 7 dias por semana).
  • O backup COMPLETO é feito todos os dias às 3h.
  • Os VLFs permanecem "ativos" (status 2) quando olho paradbcc loginfo
  • log_reuse_wait_descestá relatando "LOGBACKUP" emsys.databases
  • dbcc opentrannão está relatando nenhuma transação ativa
  • @@version: Microsoft SQL Server 2005 - 9.00.5069.00 (X64) 22 de agosto de 2012 18:02:46 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition (64 bits) no Windows NT 6.1 (Build 7601: Service Pack 1)

Problema:

Portanto, meu problema é simples, devido a restrições de hardware e parâmetros de tempo, preciso manter o tamanho do log de transações o menor possível. acredito que o motivo de não estar liberando o espaço é porque os VLFs estão ativos e ele acha que precisa fazer um LOGBACKUP para liberar, mas depois de inúmeros backups de log, log_reuse_wait_descainda está informando aguardando um backup de log!

Eu poderia mudar o modelo de recuperação para simples, encolher e voltar, mas isso quebra minha cadeia de LSN e minha implementação de Log Shipping, então não é realmente uma solução viável!

TIA.

sql-server sql-server-2005
  • 3 respostas
  • 1030 Views
Martin Hope
Jon
Asked: 2018-07-12 08:06:30 +0800 CST

Existe alguma maneira de adicionar uma testemunha sem reiniciar a testemunha depois?

  • 4

Desejo adicionar uma terceira instância do servidor SQL aos meus pares de espelhamento para atuar como testemunha . Quando eu configuro a testemunha, o espelho permanece desconectado da testemunha e o log do espelho acumula erros. Há dois erros distintos que ocorrem com o mesmo carimbo de data/hora se repetindo a cada ~24 segundos.

Mensagem de erro de espelho 1:

Erro: 1438, Gravidade: 16, Estado: 2.

Mensagem de erro de espelho 2:

A instância do servidor Witness rejeitou a solicitação de configuração; leia seu arquivo de log de erros para obter mais informações. O motivo 1451 e o estado 3 podem ser úteis para diagnósticos da Microsoft. Este é um erro transitório, portanto, tentar novamente a solicitação provavelmente será bem-sucedido. Corrija a causa, se houver, e tente novamente.

Não há erros correspondentes no servidor testemunha que eu possa encontrar.

O Monitor de Espelhamento de Banco de Dados mostrará a conexão testemunha como desconectada no espelho

Monitor de espelhamento de banco de dados

Nesse cenário, tenho três instâncias do SQL Server. SqlServer01 é o princípio. SqlServer02 é o espelho. O modo de operação é de alta segurança. Estou tentando fazer a transição para alta segurança com failover automático adicionando SqlServer03 como testemunha.

Todas as instâncias estão executando a mesma versão do SQL Server 2005, 9.00.5292.

A autenticação é via usuários do SQL Server com certificado.

A única solução que encontrei até agora é reiniciar o SQL Server na testemunha. Existe uma maneira melhor? Por que a testemunha precisa ser reiniciada?

Eu realmente gostaria de evitar reiniciar as testemunhas porque quando eu configuro isso no meu ambiente de produção, as testemunhas também fazem parte de pares de espelhamento separados com suas próprias testemunhas separadas. Portanto, reiniciar o SQL Server em um servidor causará um failover de todos os bancos de dados principais nesse servidor.

sql-server sql-server-2005
  • 1 respostas
  • 466 Views
Martin Hope
ContractDeebz
Asked: 2018-06-28 02:12:44 +0800 CST

Permissões herdadas: SQL Server 2005 vs 2016

  • 0

Pergunta:

  • Eu tenho um servidor SQL Server 2005 e um servidor SQL Server 2016.
  • Em cada servidor há um banco de dados (A) com um procedimento armazenado que seleciona dados de uma visualização no Banco de Dados (A)
  • A visão no banco de dados (A) está referenciando uma tabela no banco de dados (B) no MESMO SERVIDOR
  • Estou usando um logon que tem SOMENTE permissão de execução no procedimento armazenado no banco de dados (A).
  • Esta configuração é a mesma para AMBOS os servidores.
  • No servidor 2005, posso executar o SP como o logon descrito e recuperar dados por meio da exibição no banco de dados (A) da tabela no banco de dados (B) - como seria de esperar.
  • No servidor 2016, recebo um erro porque no banco de dados (A) não consigo selecionar, via SP e a view, dados da tabela no banco de dados (B).

Ambos os servidores estão executando o SQL Server Standard Edition - (embora um seja 2005 e um seja 2016).

Para resumir:

SQL Server 2005

  • DATABASE A = VIEW = TABLE no DATABASE B
  • DATABASE A = STORED PROCEDURE = selecione em VIEW
  • LOGON = APENAS EXECUTAR NO PROCEDIMENTO ARMAZENADO
  • RESULTADO = SUCESSO

SQL Server 2016

  • A CONFIGURAÇÃO PARECE IDÊNTICA
  • RESULTADO = FALHA

Por que é isso? O que há de diferente entre essas duas versões do SQL no que diz respeito à herança de permissões? É algo muito óbvio que estou perdendo?

Qualquer indicação seria muito útil!

sql-server-2005 sql-server-2016
  • 1 respostas
  • 339 Views
Martin Hope
WickedNet
Asked: 2018-05-05 06:25:26 +0800 CST

UPDATE em combinação com consultas SELECT aninhadas e LEFT OUTER JOIN

  • 1

Eu tenho um problema com uma instrução UPDATE que contém uma instrução SELECT aninhada em combinação com instruções LEFT OUTER JOIN.

Situação: Em nosso banco de dados há uma nova coluna adicionada a todas as pessoas que estão em nosso banco de dados, e quero atualizar a coluna com o valor "X" em determinadas pessoas, mas apenas para as pessoas que possuem determinadas condições.

Com a seguinte instrução SELECT eu seleciono com sucesso todas as pessoas que precisam ter esta coluna atualizada. A coluna que quero atualizar é "Testfield"

SELECT
    TESTDB.CONTACT.number2 AS CustomerID,
    TESTDB.PERSON.firstname AS FirstName,
    TESTDB.PERSON.lastname AS LastName,
    (SELECT UPPER(string19) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) AS Testfield
FROM         
    TESTDB.CONTACT 
    LEFT OUTER JOIN TESTDB.PERSON ON TESTDB.CONTACT.contact_id = TESTDB.PERSON.contact_id
    LEFT OUTER JOIN TESTDB.UDPERSONSMALL ON TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.udpersonSmall_id 
    LEFT OUTER JOIN TESTDB.UDCONTACTLARGE ON TESTDB.CONTACT.userdef2_id = TESTDB.UDCONTACTLARGE.udcontactLarge_id
WHERE 
    (TESTDB.CONTACT.contact_id = TESTDB.PERSON.contact_id) 
/*  No retired people*/
    AND TESTDB.PERSON.retired = '0'
/*  Other conditions*/
    AND ((SELECT UPPER(string05) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'A'
    OR  (SELECT UPPER(string07) FROM CRM5.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'B'
    OR  (SELECT UPPER(string08) FROM CRM5.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'C')
/*  testpersonen*/
    AND (SELECT string45 FROM TESTDB.UDPERSONLARGE WHERE TESTDB.PERSON.userdef2_id = TESTDB.UDPERSONLARGE.UDPERSONLARGE_id) = '123'
ORDER BY
    CustomerID, FirstName, LastName

Resultado:

10001;Test1;Person1;
10001;Test2;Person2;
10001;Test3;Person3;
10001;Test4;Person4;
10001;Test6;Person6;
10001;Test7;Person7;
10001;Test8;Person8;

(7 rows affected)

Isso está correto, as pessoas têm o valor NULL no Testfield no momento. (a quarta coluna está vazia)

Agora quero atualizar a coluna "Testfield", e tentei isso até agora:

UPDATE
    TESTDB.CONTACT 
    LEFT OUTER JOIN TESTDB.PERSON ON TESTDB.CONTACT.contact_id = TESTDB.PERSON.contact_id
    LEFT OUTER JOIN TESTDB.UDPERSONSMALL ON TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.udpersonSmall_id 
    LEFT OUTER JOIN TESTDB.UDCONTACTLARGE ON TESTDB.CONTACT.userdef2_id = TESTDB.UDCONTACTLARGE.udcontactLarge_id
SET
    (SELECT UPPER(string19) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'J'
WHERE 
    (TESTDB.CONTACT.contact_id = TESTDB.PERSON.contact_id) 
/*  No retired people*/
    AND TESTDB.PERSON.retired = '0'
/*  Other conditions*/
    AND ((SELECT UPPER(string05) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'A'
    OR  (SELECT UPPER(string07) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'B'
    OR  (SELECT UPPER(string08) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'C')
/*  testpersonen*/
    AND (SELECT string45 FROM TESTDB.UDPERSONLARGE WHERE TESTDB.PERSON.userdef2_id = TESTDB.UDPERSONLARGE.UDPERSONLARGE_id) = '123'

Mas aqui recebo o erro de que não aceita o LEFT OUTER JOIN colocado aqui:

Msg 156, Level 15, State 1, Server TESTSERVER, Line 3
Incorrect syntax near the keyword 'LEFT'.
Msg 156, Level 15, State 1, Server TESTSERVER, Line 7
Incorrect syntax near the keyword 'SET'.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 7
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 15
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 16
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 17
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 19
Incorrect syntax near '='.

Eu também tentei assim:

UPDATE
    TESTDB
SET
    (SELECT UPPER(string19) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'X'
FROM
    TESTDB.CONTACT 
    LEFT OUTER JOIN TESTDB.PERSON ON TESTDB.CONTACT.contact_id = TESTDB.PERSON.contact_id
    LEFT OUTER JOIN TESTDB.UDPERSONSMALL ON TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.udpersonSmall_id 
    LEFT OUTER JOIN TESTDB.UDCONTACTLARGE ON TESTDB.CONTACT.userdef2_id = TESTDB.UDCONTACTLARGE.udcontactLarge_id
WHERE 
    (TESTDB.CONTACT.contact_id = TESTDB.PERSON.contact_id) 
/*  No retired people*/
    AND TESTDB.PERSON.retired = '0'
/*  Other conditions*/
    AND ((SELECT UPPER(string05) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'X'
    OR  (SELECT UPPER(string07) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'X'
    OR  (SELECT UPPER(string08) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'X')
/*  testpersonen*/
    AND (SELECT string45 FROM TESTDB.UDPERSONLARGE WHERE TESTDB.PERSON.userdef2_id = TESTDB.UDPERSONLARGE.UDPERSONLARGE_id) = '123'

Isso resulta em outro erro:

Msg 102, Level 15, State 1, Server TESTSERVER, Line 4
Incorrect syntax near '('.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 4
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 17
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 18
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 19
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 21
Incorrect syntax near '='.

O software é um CRM com banco de dados SQL Server 2005.

Alguém poderia me ajudar com a sintaxe? Estou me perdendo.

Desde já, obrigado.

sql-server sql-server-2005
  • 2 respostas
  • 2266 Views
Martin Hope
Giri Bkm
Asked: 2018-03-27 18:42:56 +0800 CST

Como saber se esse plano de execução é adequado para esta consulta (Sql server 2005)?

  • 1

Esta é a minha consulta.

Declare
    @Pivv NVarchar(Max),
    @Query NVarchar(Max),
    @Pivv1 NVarchar(Max),
    @Columns NVarchar(Max)

Select
    @Pivv = Coalesce(@Pivv + ',' , '') + 
            Quotename(MatchType + '_' + '_Name'),
    @Pivv1 = Coalesce(@Pivv1 + ',' , '') + 
             Quotename('HighestRunsAndWicketsIn' + MatchType),
    @Columns = Isnull(@Columns + ',', '') +
               'Max(' + (MatchType + '_' + '_Name') + ') As ' + (MatchType + '_' + '_Name') +
               ',' +
               'Max(' + ('HighestRunsAndWicketsIn' + MatchType) + ') As ' + ('HighestRunsAndWicketsIn' + MatchType)
From
    PlayersCareerBatting t Join PlayersBioDataNew a
On
    t.Id=a.Id
Group By
    MatchType

Set @Query=
        'Select
            ''Batting'',
            ' + @Columns + '
        From (
                Select
                    MatchType + ''_'' + ''_Name'' As Type1,
                    FirstName + '' '' + MiddleName + '' '' + LastName As Runs1,
                    ''HighestRunsAndWicketsIn'' + MatchType As Type,
                    RunsScored As Runs
                From ( 
                        Select 
                            FirstName, 
                            MiddleName,
                            LastName, 
                            MatchType, 
                            RunsScored
                        From (
                                Select 
                                    s.Id, 
                                    FirstName, 
                                    MiddleName,
                                    LastName, 
                                    MatchType, 
                                    RunsScored, 
                                    Row_Number() Over(Partition By MatchType Order By RunsScored Desc) rn
                                From 
                                    PlayersCareerBatting s Join PlayersBioDataNew a 
                                On s.Id=a.Id
                             ) x
                        Where rn=1
                     ) x2
             ) x3
        Pivot 
            (
                Max(Runs1) For Type1 In (' + @Pivv + ')
            ) x4
        Pivot
            (
                Max(Runs) For Type In (' + @Pivv1 + ')
            ) x5

        Union All

        Select
            ''Bowling'',
            ' + @Columns + '
        From (
                Select
                    MatchType + ''_'' + ''_Name'' As Type1,
                    FirstName + '' '' + MiddleName + '' '' + LastName As Wickets1,
                    ''HighestRunsAndWicketsIn'' + MatchType As Type,
                    Wickets As Wickets
                From ( 
                        Select 
                            FirstName, 
                            MiddleName,
                            LastName,
                            MatchType, 
                            Wickets
                        From (
                                Select 
                                    s.Id, 
                                    FirstName, 
                                    MiddleName,
                                    LastName, 
                                    MatchType, 
                                    Wickets, 
                                    Row_Number() Over(Partition By MatchType Order By Wickets Desc) rn
                                From 
                                    PlayersBowlingCareer s Join PlayersBioDataNew a 
                                On s.Id=a.Id
                             ) x6
                        Where rn=1
                     ) x7
             ) x8 
        Pivot 
            (
                Max(Wickets1) For Type1 In (' + @Pivv + ')
            ) x9
        Pivot
            (
                Max(Wickets) For Type In (' + @Pivv1 + ')
            ) x10'

Exec(@Query)

A consulta contém 3 tabelas. Playersbiodatanew (5000 linhas), players?careerbatting (20000 linhas), playersbowlingcareer (20000 linhas). E, eu criei pivô nessa consulta. Agora eu quero saber, essa consulta é mais adequada para o plano de execução mencionado abaixo

plano de execução

plano de execução

plano de execução

Link para plano de execução, https://www.brentozar.com/pastetheplan/?id=SyJPRDs9M

Dados de amostra

Para jogadores de mesaBioDataNew

Id | Firstname | middlename | lastname
----------------------------------------
1  | Sachin    | Ramesh     | Tendulkar
----------------------------------------
2  | Suresh    | Kumar      | Raina
----------------------------------------

Para Jogadores de MesaCarreiraBatting

CareerId | Id | Matchtype | runsscored
---------------------------------------
1        | 1  | Test      | 15921
----------------------------------------
2        | 1  | ODI       | 18426
----------------------------------------
3        | 1  | T20I      | 10
----------------------------------------
4        | 1  | IPL       | 2334
----------------------------------------
5        | 2  | Test      | 768
----------------------------------------
6        | 2  | ODI       | 5568
----------------------------------------
7        | 2  | T20I      | 1498
----------------------------------------
8        | 2  | IPL       | 4540
----------------------------------------

Para Jogadores De MesaBowlingCarreira

CareerId | Id | Matchtype | wickets
---------------------------------------
1        | 1  | Test      | 46
----------------------------------------
2        | 1  | ODI       | 154
----------------------------------------
3        | 1  | T20I      | 1
----------------------------------------
4        | 1  | IPL       | 0
----------------------------------------
5        | 2  | Test      | 13
----------------------------------------
6        | 2  | ODI       | 36
----------------------------------------
7        | 2  | T20I      | 13
----------------------------------------
8        | 2  | IPL       | 25
----------------------------------------

Saída esperada

(No Column Name) | IPL__Name | HighestRunsAndWicketsInIPL | Test__Name | HighestRunsAndWicketsInTest | T20I__Name | HighestRunsAndWicketsInT20I | ODI__Name | HighestRunsAndWicketsInODI
----------------------------------------------------------------------------
Batting | Suresh Kumar Raina | 4540 | Sachin Ramesh Tendulkar | 15921 | Suresh Kumar Raina | 1498 | Sachin Ramesh Tendulkar | 18426
----------------------------------------------------------------------------
Bowling | Suresh Kumar Raina | 25 | Sachin Ramesh Tendulkar | 46 | Suresh Kumar Raina | 13 | Sachin Ramesh Tendulkar | 154
----------------------------------------------------------------------------

Estou obtendo a saída de quem obteve o máximo de pontos e wickets para cada tipo de partida.

sql-server sql-server-2005
  • 1 respostas
  • 131 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve