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 / user-6965

Andriy M's questions

Martin Hope
Andriy M
Asked: 2024-02-09 12:59:04 +0800 CST

Índice exclusivo na coluna computada quando as colunas contribuintes já são exclusivas

  • 9

Eu tenho uma tabela assim:

CREATE TABLE
  dbo.DiscountBarcodeList
(

  ID int NOT NULL IDENTITY
    CONSTRAINT PK_DiscountBarcodeList
    PRIMARY KEY CLUSTERED

, Discount int NOT NULL
    CONSTRAINT FK_DiscountBarcodeList_Discount
    FOREIGN KEY REFERENCES dbo.Discount (ID)

, CodeNumber int NOT NULL

, AssignedEntity int NULL
    CONSTRAINT FK_DiscountBarcodeList_AssignedEntity
    FOREIGN KEY REFERENCES dbo.Entity (ID)
    ON DELETE SET NULL

, BarcodeID AS
    CONVERT(
      char(10)
    , CAST(Discount AS binary(2)) + CAST(CodeNumber AS binary(3))
    , 2)

, CONSTRAINT UQ_DiscountBarcodeList_DiscountCodeNumber
    UNIQUE NONCLUSTERED 
    (
      Discount  ASC
    , CodeNumber ASC
    )

);

A tabela manterá CodeNumbers alocados para Discounts antecipadamente e atribuídos a Entitys sob demanda. Embora não esteja no nível do banco de dados, os valores de Discounte CodeNumberserão limitados a 2 bytes e 3 bytes, respectivamente. Essas limitações, juntamente com a restrição exclusiva de , também (Discount, CodeNumber)tornarão efetivamente os valores gerados únicos.BarcodeID

A forma como esta tabela deve ser usada é: o aplicativo passará um @BarcodeIDpara procurar @Entitye atribuir a ela. Se a pesquisa for bem-sucedida, as linhas Entityserão definidas como @Entityou o aplicativo será notificado de que @BarcodeIDjá foi usado, algo como isto:

BEGIN TRANSACTION;

UPDATE
SET
  @OldEntity = Entity
, Entity = @Entity
WHERE
  BarcodeID = @BarcodeID
;

IF @OldEntity IS NULL
BEGIN
  COMMIT TRANSACTION;
  ...  /* report success */
END

ELSE
BEGIN
  ROLLBACK TRANSACTION;
  ...  /* report failure */
END;

Agora eu gostaria de fazer BarcodeIDsargável. Como sei que a coluna terá apenas valores únicos, estou pensando em tornar o índice único, pois acho que isso pode tornar minha pesquisa mais eficiente. Por outro lado, estou preocupado que os valores gerados tenham que ser verificados quanto à exclusividade, o que é redundante aqui, uma vez que a exclusividade já está garantida.

É possível dizer de alguma forma se os benefícios, se houver, de um índice exclusivo em uma coluna computada superarão a provável sobrecarga da verificação de exclusividade (desnecessária neste caso)? Ou pelo menos é possível determinar isso para um cenário como o meu? Ou estou apenas pensando demais nisso?

sql-server
  • 1 respostas
  • 188 Views
Martin Hope
Andriy M
Asked: 2019-12-05 03:06:25 +0800 CST

Insira várias linhas em uma tabela com apenas uma coluna IDENTITY [duplicado]

  • 7
Essa pergunta já tem resposta aqui :
como insiro uma linha padrão? (1 resposta)
Fechado há 2 anos .

Eu tenho uma tabela chamada dbo.Groupsdefinida assim:

CREATE TABLE dbo.Groups
(
  GroupID int NOT NULL IDENTITY (1,1) PRIMARY KEY
);

A tabela realmente consiste em apenas uma IDENTITYcoluna.

Às vezes, quero inserir várias linhas de uma só vez e obter os IDs gerados. (Já tenho uma variável de tabela pré-definida chamada @outputcom uma única IDcoluna para ser usada na OUTPUTcláusula.)

Agora eu sei como eu procederia se fosse uma única linha:

INSERT INTO
  dbo.GroupID
OUTPUT
  inserted.GroupID INTO @output (ID)
DEFAULT VALUES
;

Mas eu quero ser capaz de inserir dois ou mais de uma só vez. O número real é determinado pelo número de linhas retornadas por esta consulta:

SELECT
  *
FROM
  dbo.MySource
;

Portanto, se a consulta retornar uma linha, quero inserir uma linha dbo.Groupse retornar o arquivo GroupID. Se for cem linhas, eu esperaria cem linhas inseridas e cem IDs gerados e retornados de uma só vez.

Um método óbvio é inserir uma linha de cada vez em um loop. Eu gostaria de evitar isso e usar uma abordagem baseada em conjuntos, algo na linha de

INSERT INTO
  dbo.GroupID
OUTPUT
  inserted.GroupID INTO @output (ID)
SELECT
  ...  -- what?
FROM
  dbo.MySource
;

Existe uma maneira de inserir várias linhas em uma tabela com apenas uma IDENTITYcoluna em (de preferência) uma única instrução?

sql-server sql-server-2008
  • 1 respostas
  • 2032 Views
Martin Hope
Andriy M
Asked: 2019-10-19 06:41:11 +0800 CST

ID de sessão no SQLCMD executando script de vários lotes

  • 2

Meu script contém várias palavras- GOchave. Eu sei que o SQLCMD interpreta GOcomo um delimitador de lote, portanto, o código não é executado como um único bloco, mas cada parte entre os delimitadores (um lote) é executada separadamente. Minha pergunta é, todos os lotes são executados na mesma sessão?

Eu tentei testar isso usando um script simples como este:

SELECT @@SPID
GO

SELECT @@SPID
GO

SELECT @@SPID
GO

Em seguida, executei o script na linha de comando usando este comando

SQLCMD -S MyServer\Instance -E -i MyScript.sql

e obtive esta saída:


------
    62

(1 rows affected)

------
    62

(1 rows affected)

------
    62

(1 rows affected)

Parecia responder minha pergunta de forma afirmativa, mas depois executei o script novamente e obtive exatamente a mesma saída, ou seja, todos os valores foram 62novamente. Aparentemente, as duas execuções separadas do SQLCMD não poderiam ser executadas na mesma sessão, elas apenas receberam o mesmo ID de sessão. Mas isso, por sua vez, me faz pensar que o mesmo @@SPIDvalor retornado por uma única execução pode não significar necessariamente que foi a mesma sessão. Cada lote pode ser executado em uma sessão diferente que acabou de receber o mesmo ID, semelhante a como diferentes execuções do SQLCMD estavam sendo executadas em diferentes sessões com o mesmo ID.

Portanto, minha pergunta ainda permanece: vários lotes do mesmo script são executados no SQLCMD na mesma sessão ou não? Existe uma maneira de determinar isso?

sql-server sqlcmd
  • 1 respostas
  • 196 Views
Martin Hope
Andriy M
Asked: 2019-05-07 03:04:28 +0800 CST

Concatenar todos os valores do mesmo elemento XML usando XPath/XQuery

  • 14

Eu tenho um valor XML como este:

<R>
  <I>A</I>
  <I>B</I>
  <I>C</I>
  ...
</R>

Eu quero concatenar todos os Ivalores e devolvê-los como uma única string: ABC....

Agora eu sei que posso destruir o XML, agregar os resultados de volta como um XML sem nó e aplicar .values('text()[1]', ...)ao resultado:

SELECT
  (
    SELECT
      n.n.value('text()[1]', 'varchar(50)') AS [text()]
    FROM
      @MyXml.nodes('/R/I') AS n (n)
    FOR XML
      PATH (''),
      TYPE
  ).value('text()[1]', 'varchar(50)')
;

No entanto, gostaria de fazer tudo isso usando apenas métodos XPath/XQuery, algo assim:

SELECT @MyXml. ? ( ? );

Existe tal maneira?

A razão pela qual estou procurando uma solução nesse sentido é porque meu XML real contém outros elementos também, por exemplo:

<R>
  <I>A</I>
  <I>B</I>
  <I>C</I>
  ...
  <J>X</J>
  <J>Y</J>
  <J>Z</J>
  ...
</R>

E eu gostaria de poder extrair os Ivalores como uma única string e os Jvalores como uma única string sem ter que usar um script complicado para cada um.

sql-server sql-server-2014
  • 3 respostas
  • 4909 Views
Martin Hope
Andriy M
Asked: 2018-05-12 04:34:27 +0800 CST

Combinando um ] (colchete de fechamento) com PATINDEX usando o curinga "[ ]"

  • 9

Estou escrevendo um analisador JSON personalizado em T-SQL † .

Para fins do meu analisador, estou usando a PATINDEXfunção que calcula a posição de um token de uma lista de tokens. Os tokens no meu caso são todos caracteres únicos e incluem estes:

{ } [ ] : ,

Normalmente, quando preciso encontrar a (primeira) posição de qualquer um dos vários caracteres fornecidos, uso a PATINDEXfunção assim:

PATINDEX('%[abc]%', SourceString)

A função então me dará a primeira posição de aou bou c– o que for encontrado primeiro – em SourceString.

Agora o problema no meu caso parece estar relacionado com o ]personagem. Assim que eu especificar na lista de caracteres, por exemplo, assim:

PATINDEX('%[[]{}:,]%', SourceString)

meu padrão pretendido aparentemente se quebra, porque a função nunca encontra uma correspondência. Parece que preciso de uma maneira de escapar do primeiro ]para que PATINDEXo trate como um dos caracteres de pesquisa em vez de um símbolo especial.

Eu encontrei esta pergunta perguntando sobre um problema semelhante:

  • Precisa de ajuda com o operador LIKE e colchetes

No entanto, nesse caso o ]simplesmente não precisa ser especificado entre colchetes, porque é apenas um caractere e pode ser especificado sem colchetes ao redor deles. A solução alternativa, que usa escape, funciona apenas para LIKEe não para PATINDEX, porque usa uma ESCAPEsubcláusula, apoiada pela primeira e não pela segunda.

Então, minha pergunta é, existe alguma maneira de procurar um ]usando PATINDEXo [ ]curinga? Ou existe uma maneira de emular essa funcionalidade usando outras ferramentas Transact-SQL?

informação adicional

Aqui está um exemplo de uma consulta onde eu preciso usar PATINDEXcom o […]padrão acima. O padrão aqui funciona (embora um pouco ) porque não inclui o ]personagem. Eu preciso dele para trabalhar com ]também:

WITH
  data AS (SELECT CAST('{"f1":["v1","v2"],"f2":"v3"}' AS varchar(max)) AS ResponseJSON),
  parser AS
  (
    SELECT
      Level         = 1,
      OpenClose     = 1,
      P             = p.P,
      S             = SUBSTRING(d.ResponseJSON, 1, NULLIF(p.P, 0) - 1),
      C             = SUBSTRING(d.ResponseJSON, NULLIF(p.P, 0), 1),
      ResponseJSON  = SUBSTRING(d.ResponseJSON, NULLIF(p.P, 0) + 1, 999999)
    FROM
      data AS d
      CROSS APPLY (SELECT PATINDEX('%[[{]%', d.ResponseJSON)) AS p (P)
    UNION ALL
    SELECT
      Level         = ISNULL(d.OpenClose - 1, 0) + d.Level + ISNULL(oc.OpenClose, 0),
      OpenClose     = oc.OpenClose,
      P             = d.P + p.P,
      S             = SUBSTRING(d.ResponseJSON, 1, NULLIF(p.P, 0) - 1),
      C             = c.C,
      ResponseJSON  = SUBSTRING(d.ResponseJSON, NULLIF(p.P, 0) + 1, 999999)
    FROM
      parser AS d
      CROSS APPLY (SELECT PATINDEX('%[[{}:,]%' COLLATE Latin1_General_BIN2, d.ResponseJSON)) AS p (P)
      CROSS APPLY (SELECT SUBSTRING(d.ResponseJSON, NULLIF(p.P, 0), 1)) AS c (C)
      CROSS APPLY (SELECT CASE WHEN c.C IN ('[', '{') THEN 1 WHEN c.C IN (']', '}') THEN 0 END) AS oc (OpenClose)
    WHERE 1=1
      AND p.P <> 0
  )
SELECT
  *
FROM
  parser
OPTION
  (MAXRECURSION 0)
;

A saída que recebo é:

Level  OpenClose  P   S      C   ResponseJSON
-----  ---------  --  -----  --  ---------------------------
1      1          1          {   "f1":["v1","v2"],"f2":"v3"}
1      null       6   "f1"   :   ["v1","v2"],"f2":"v3"}
2      1          7          [   "v1","v2"],"f2":"v3"}
2      null       12  "v1"   ,   "v2"],"f2":"v3"}
2      null       18  "v2"]  ,   "f2":"v3"}
2      null       23  "f2"   :   "v3"}
2      0          28  "v3"   }   

Você pode ver que o ]está incluído como parte de Suma das linhas. A Levelcoluna indica o nível de aninhamento, significando aninhamento de colchetes e chaves. Como você pode ver, uma vez que o nível se torna 2, ele nunca retorna a 1. Teria sido se eu pudesse fazer PATINDEXreconhecer ]como um token.

A saída esperada para o exemplo acima é:

Level  OpenClose  P   S     C   ResponseJSON
-----  ---------  --  ----  --  ---------------------------
1      1          1         {   "f1":["v1","v2"],"f2":"v3"}
1      NULL       6   "f1"  :   ["v1","v2"],"f2":"v3"}
2      1          7         [   "v1","v2"],"f2":"v3"}
2      NULL       12  "v1"  ,   "v2"],"f2":"v3"}
2      0          17  "v2"  ]   ,"f2":"v3"}
1      NULL       18        ,   "f2":"v3"}
1      NULL       23  "f2"  :   "v3"}
1      0          28  "v3"  }

Você pode brincar com esta consulta em db<>fiddle .


† Estamos usando o SQL Server 2014 e provavelmente não atualizaremos em breve para uma versão que suporte a análise JSON nativamente. Eu poderia escrever um aplicativo para fazer o trabalho, mas os resultados da análise precisam ser processados ​​posteriormente, o que implica mais trabalho no aplicativo do que apenas a análise - o tipo de trabalho que seria muito mais fácil e provavelmente mais eficiente feito com um script T-SQL, se eu pudesse aplicá-lo diretamente aos resultados.

É muito improvável que eu possa usar o SQLCLR como solução para esse problema. No entanto, não me importo se alguém decidir postar uma solução SQLCLR, pois isso pode ser útil para outras pessoas.

sql-server t-sql
  • 5 respostas
  • 5508 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