Database
 sql >> Base de Dados >  >> RDS >> Database

SQL avançado:insira a saída da função com valor de tabela parametrizada na tabela SQL


Neste artigo, vou demonstrar o seguinte:
  1. Como inserir a saída de uma função com valor de tabela em uma tabela SQL.
  2. Como inserir a saída de uma função com valor de tabela que é criada no servidor de banco de dados remoto.

O que é a declaração "Inserir em"


No RDBMS, “Inserir em” é uma das instruções SQL básicas. É usado para inserir novos registros em uma tabela SQL. Usando a instrução, podemos executar as seguintes tarefas:
  • Inserir novos registros em uma tabela (Inserção básica).
  • Insira valores de uma coluna específica em uma tabela.
  • Insira a saída gerada por um procedimento armazenado em uma tabela SQL.

Para demonstrar o que foi dito acima, vamos criar uma tabela chamada “Alunos ” no DemoDatabase. Execute o seguinte código para criar a tabela:
CREATE TABLE STUDENTS ( ID INT IDENTITY(1, 1) PRIMARY KEY, FIRSTNAME VARCHAR(250), LASTNAME VARCHAR(250), ADMISSIONDATE DATETIME, GRADE CHAR(1) )

Executar inserção básica


Para realizar a inserção básica, precisamos fornecer o nome da tabela de destino e os valores da tabela. Veja a seguir uma sintaxe básica da instrução de inserção básica:
INSERT INTO  VALUES ( , .. )

Por exemplo, queremos inserir nome, sobrenome e nota de três alunos na tabela “Alunos”. Para isso, execute o seguinte código:
INSERIR VALORES PARA ESTUDANTES ('NISARG', 'UPADHYAY', '2018-09-11', 'A'), ('RAGHAV', 'DATTA', '2017-10-01', 'A') , ('KIRAN', 'AMIN', '2016-01-31', 'A')

Execute a consulta “Selecionar” em “Aluno” para revisar os resultados.
SELECIONE NOME, SOBRENOME, DATA DE ADMISSÃO, NOTA DOS ESTUDANTES

O resultado é o seguinte:


Inserir valores de uma coluna específica na tabela


Para inserir valores em colunas específicas de uma tabela, você precisa fornecer o nome da tabela de destino e o nome das colunas nas quais deseja inserir dados. Segue a sintaxe.
INSERIR EM  ( COLUMN 1 , COLUMN 2 ) VALORES ( , .. )

Por exemplo, queremos inserir o nome e o sobrenome de dois alunos no campo “Alunos " tabela. Para isso, execute o seguinte código:
INSERIR VALORES DE ALUNOS (NOME, SOBRENOME) ('NIMESH', 'UPADHYAY'), ('RUPESH', 'DATTA')

Execute a consulta "Selecionar" em relação aos "Alunos " tabela.
SELECIONE NOME, SOBRENOME, DATA DE ADMISSÃO, NOTA DOS ESTUDANTES

A saída tem a seguinte aparência:


Insira a saída, gerada por um procedimento armazenado


Para inserir a saída de um procedimento armazenado na tabela, precisamos especificar o nome da tabela de destino e o procedimento armazenado de origem. Para gerar a saída do procedimento armazenado, precisamos usar a palavra-chave “exec” ou “EXECUTE”. Portanto, precisamos fornecer o nome da tabela ou os nomes das colunas seguidos da palavra-chave “exec”. Segue a sintaxe:
INSERIR EM  ( COLUMN 1 , COLUMN 2 ) EXEC 

Por exemplo, queremos inserir a saída do procedimento que preenche os nomes dos alunos cuja data de admissão não é nula. Para fazer isso, criaremos um procedimento armazenado chamado “spGet_Student_AdmissionDate ”. Para criar um procedimento armazenado, execute o seguinte código:
USE DEMODATABASE GO CREATE PROCEDURE SPGET_STUDENT_ADMISSIONDATE AS BEGIN SELECT ISNULL(FIRSTNAME, '') + ' ' + ISNULL(LASTNAME, '') AS STUDENTNAME, ADMISSIONDATE, GRADE FROM STUDENTS WHERE ADMISSIONDATE IS NOT NULL END

Depois que o procedimento for criado, execute o procedimento executando o seguinte código:
EXECUTAR spGet_Student_Admissiondate

A saída tem a seguinte aparência:



Como mencionei acima, queremos inserir a saída do procedimento armazenado chamado “spGet_Student_Admissiondate ” em uma tabela temporária. Primeiramente, execute o seguinte código para criar a tabela:
 ( ID INT IDENTITY(1, 1), STUDENTNAME VARCHAR(250), ADMISSIONDATE DATETIME, GRADE CHAR(1) )

Depois que a tabela for criada, execute o seguinte código para inserir a saída de “spGet_Student_Admissiondate ” para “#TempStudents ”.
INSERT INTO #TEMPSTUDENTS EXECUTE SPGET_STUDENT_ADMISSIONDATE Saída:(3 linhas afetadas)

Agora vamos verificar a saída de “#TEMPSTUDENTS ”. Para isso, execute o seguinte código:



Agora, como mencionei acima, vou demonstrar como podemos inserir uma saída gerada por uma função com valor de tabela em uma Tabela SQL. Primeiramente, vamos entender o que é uma função com valor de tabela.

O que é função com valor de tabela


Uma função com valor de tabela é um código T-SQL especial que aceita parâmetros/parâmetros e, com base nas condições definidas em uma variável, retorna o conjunto de resultados na variável de tabela. A seguir estão os benefícios de usar a função com valor de tabela:
  1. Ele pode ser executado dentro da consulta Selecionar.
  2. Pode ser usado em várias partes de uma consulta, por exemplo, na instrução Case, cláusulas where/have.
  3. A saída de uma função com valor de tabela é um conjunto de registros, portanto, você pode unir a função com tabelas.

Inserir saída da função com valor de tabela inline na tabela SQL


Nesta seção, explicarei como inserir a saída de uma função com valor de tabela em uma tabela SQL usando T-SQL.

Para demonstração, estou usando o banco de dados AdventureWorks2014. Eu criei uma função de tabela de vários valores em linha chamada “GetEmployeesbyHireDate .” Esta função preenche as informações dos funcionários, contratados em uma data e horário específicos. A função usa o @FormDate e @Toda te parâmetros para filtrar os dados. A saída da função será armazenada em uma Tabela SQL.

O código a seguir cria uma função:
CRIAR FUNÇÃO GETEMPLOYEESBYHIREDATE (@FROMDATE AS DATETIME, @TODATE AS DATETIME) RETURNS @EMPLOYEES TABLE ( EMPLOYEENAME VARCHAR (MAX), BIRTHDATE DATETIME, JOBTITLE VARCHAR(150), EMAILID VARCHAR(100), PHONENUMBER VARCHAR(20), HIREDATE DATETIME ) AS BEGIN INSERT INTO @EMPLOYEES SELECT ( ISNULL( B.FIRSTNAME, '') + ' ' + ISNULL( B.MIDDLENAME, '') + ' ' + ISNULL( B.LASTNAME, '') )AS EMPLOYEENAME, A .DATA DE NASCIMENTO, B.TÍTULO DO TRABALHO, B.ENDEREÇO ​​DE E-MAIL, NÚMERO DE TELEFONE, A.CONTRATADO DE [RECURSOS HUMANOS].[FUNCIONÁRIO] A INNER JOINTE [RECURSOS HUMANOS].[VEMPLOYEE] B EM A.BUSINESSENTITYID =B.BUSINESSENTITYID ONDE A.HIREDATE ENTRE @FROMDATE E @TODATE RETURN END

Usando a consulta Select, podemos obter a saída de uma função SQL. Por exemplo, você deseja preencher uma lista de funcionários, recrutados no ano de 2009. Execute a seguinte consulta para obter a lista:
DECLARE @FROMDT DATETIME DECLARE @TODT DATETIME SET @FROMDT='2009-01-01' SET @TODT='2009-12-31' SELECT * FROM GETEMPLOYEESBYHIREDATE(@FROMDT, @TODT)

A saída da consulta acima é a seguinte:



Agora, crie uma tabela chamada “tblEmploye e” para armazenar a saída do “GetEmployeesbyHiredate ” função. O código a seguir cria a tabela chamada “tblEmployee ”.
CREATE TABLE TBLEMPLOYEES ( EMPLOYEENAME VARCHAR (MAX), DATA DE NASCIMENTO, JOBTITLE VARCHAR(150), EMAILID VARCHAR(100), PHONENUMBER VARCHAR(20), HIREDATE DATETIME)

Como mencionei anteriormente, queremos preencher as informações dos funcionários, que foram contratados em 2009. Para isso, insira a saída do campo GetEmployeesbyHireDate função no tblEmployees tabela. Para isso, execute o seguinte código:
DECLARE @FROMDT DATETIME DECLARE @TODT DATETIME SET @FROMDT='2009-01-01' SET @TODT='2009-12-31' INSERIR EM TBLEMPLOYEES SELECT EMPLOYEENAME, BRTHDATE, JOBTITLE, EMAILID, PHONENUMBER, HIRDATE FROM GETEMPLOYEESBYHIREDATE (@FROMDT, @TODT)

Vamos verificar se os dados foram inseridos na tabela. Para isso, execute o seguinte código:
SELECIONAR * DE TBLEMPLOYEES

A saída tem a seguinte aparência:


Inserir dados em tabelas de bancos de dados remotos


Às vezes, você pode querer extrair dados dos servidores armazenados em um datacenter diferente. Isso pode ser feito usando o servidor SQL Linked.

Nesta seção, explicarei como inserir a saída da função table value, criada no servidor remoto. Agora, para demonstrar o cenário, o seguinte é a configuração.

[ID da tabela=57 /]

Na demonstração, realizaremos as seguintes tarefas:
  1. No servidor de origem (SQL_VM_1 ), crie uma função com valor de tabela chamada “getCustomerByCountry ” no “AdventureWorks2014 ” para preencher os dados.
  2. No servidor de destino, crie um servidor vinculado chamado “Remote_Server ” para executar a função (getCustomerByCountry ).
  3. No servidor de destino, crie uma tabela chamada “Cliente ” para armazenar dados, recuperados pela função remota (getCustomerByCountry ).

A imagem a seguir ilustra a configuração.


A tarefa a ser executada em um servidor de origem:


No servidor de origem (SQL_VM_1 ), crie uma função chamada “getCustomerByCountry .” Ele preenche os detalhes de um cliente localizado em um país ou região específica. A função usa o @CountryName parâmetro para filtrar os dados. Execute o código a seguir para criar a função.
Alter FUNCTION Getcustomerbycountry(@CountryName VARCHAR)retorna @Customers TABLE ( customer_name VARCHAR(500), phoennumber VARCHAR(50), endereço de email VARCHAR(100), endereço VARCHAR(max), cidade VARCHAR(150), país VARCHAR(250) ), código postal VARCHAR(50))AS BEGIN INSERT INTO @Customers SELECT customer_name, phoennumber, emailaddress, address, city, country, postalcode FROM clients WHERE country [email protected] RETURN END

As tarefas a serem executadas no servidor de destino:


Para preencher dados do servidor de origem (SQL_VM_1 ), primeiro, crie um servidor vinculado entre a fonte (SQL_VM_1 ) e destino (SQL_VM_ 2). Execute o seguinte código no servidor de destino (SQL_VM_2 ) para criar um servidor vinculado.
USE [MASTER]GOEXEC MASTER.DBO.SP_ADDLINKEDSERVER @SERVER =N'SQL_VM_1', @SRVPRODUCT=N'SQL SERVER'GOEXEC MASTER.DBO.SP_ADDLINKEDSRVLOGIN @RMTSRVNAME=N' Remote_Server',@USESELF=N'FALSE' ,@LOCALLOGIN=NULL,@RMTUSER=N'SA',@RMTPASSWORD='########'GOEXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'COLLATION COMPATIBLE', @OPTVALUE=N'TRUE'GOEXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'DATA ACCESS', @OPTVALUE=N'TRUE'GOEXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server' , @OPTNAME=N'DIST', @OPTVALUE=N'FALSE'GOEXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'PUB', @OPTVALUE=N'FALSE'GOEXEC MASTER.DBO. SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'RPC', @OPTVALUE=N'TRUE'GOEXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'RPC OUT', @OPTVALUE=N'TRUE'GOEXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'SUB', @OPTVALUE=N'FALSE'GOEXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTN AME=N'CONNECT TIMEOUT', @OPTVALUE=N'0'GOEXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'COLLATION NAME', @OPTVALUE=NULLGOEXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'LAZY SCHEMA VALIDATION', @OPTVALUE=N'FALSE'GOEXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'QUERY TIMEOUT', @OPTVALUE=N' 0'GOEXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'USE REMOTE COLLATION', @OPTVALUE=N'TRUE'GOEXEC MASTER.DBO.SP_SERVEROPTION @SERVER=N'Remote_Server', @OPTNAME=N'REMOTE PROC TRANSACTION PROMOTION', @OPTVALUE=N'FALSE'GO

Após a criação do servidor vinculado, crie uma tabela SQL para armazenar as informações dos clientes e preencha-a executando a função SQL, criada no servidor de origem (SQL_VM_1 ).

Execute o código a seguir para criar uma tabela.
USE DEMODATABASEGOCREATE TABLE CUSTOMERS ( ID INT IDENTITY(1, 1), CUSTOMER_NAME VARCHAR(500), PHONENUMBER VARCHAR(50), EMAILADDRESS VARCHAR(100), ADDRESS VARCHAR(MAX), CITY VARCHAR(150), COUNTRY VARCHAR( 250), POSTALCODE VARCHAR(50) )

Usando um servidor vinculado, podemos executar a função com valor de tabela criada em um servidor de banco de dados remoto. Ao tentar executar a função usando o servidor vinculado, ocorre o seguinte erro:
Msg 4122, Level 16, State 1, Line 28Chamadas remotas de função com valor de tabela não são permitidas.

Portanto, para executar qualquer função no servidor remoto, precisamos usar a palavra-chave OPENQUERY. Ele é usado para inicializar a consulta distribuída ad hoc usando um servidor vinculado. Consulte este artigo para entender o conceito de OPENQUERY.

Para usar OPENQUERY, precisamos habilitar o parâmetro de configuração avançado chamado “Consultas distribuídas ad hoc ” nos servidores de origem e destino. Execute o código a seguir para habilitá-lo.
USE MASTERGOEXEC SP_CONFIGURE 'MOSTRAR OPÇÃO AVANÇADA', 1RECONFIGURE COM OVERRIDEEXEC SP_CONFIGURE 'CONSULTAS DISTRIBUÍDAS AD HOC', 1RECONFIGURE COM OVERRIDE

Agora quero preencher a lista de clientes, localizada no Reino Unido e inseri-los no campo “Clientes " tabela. Como mencionei, a função aceita o nome do país para filtrar os registros. Agora, precisamos executar o seguinte script no servidor de destino (SQL_VM_2 ) para preencher a lista de clientes localizados em “Reino Unido”.
SELECT CUSTOMER_NAME, PHOENNUMBER, EMAILADDRESS, ADDRESS, CITY, COUNTRY, POSTALCODE FROM OPENQUERY([TTI609-VM2], 'DECLARE @COUNTRY VARCHAR(150)SET @COUNTRY=''UNITED KINGDOM'' SELECT * FROM [ADVENTUREWORKS2014] .DBO.GETCUSTOMERBYCOUNTRY(''''+ @COUNTRY +'''')' )

A saída tem a seguinte aparência:



Agora, para inserir dados preenchidos na tabela “Clientes”, execute o seguinte script no servidor de destino (SQL_VM_2 ).
INSERIR EM CLIENTES (CUSTOMER_NAME,PHONENUMBER,EMAILADDRESS,ADDRESS,CITY,COUNTRY,POSTALCODE)SELECT CUSTOMER_NAME, PHOENNUMBER, EMAILADDRESS, ADDRESS, CITY, COUNTRY, POSTALCODE FROM OPENQUERY([TTI609-VM2], 'DECLARE @COUNTRY VARCHAR( 150)SET @COUNTRY=''UNITED KINGDOM'' SELECT * FROM [ADVENTUREWORKS2014].DBO.GETCUSTOMERBYCOUNTRY(''''+ @COUNTRY +'''')' )/*Saída*/(1913 linhas afetadas) 
Agora vamos verificar se os dados foram inseridos corretamente. Para verificar, execute a seguinte consulta no servidor de destino (SQL_VM_2).
USE DEMODATABASEGOSELECT 20 PRINCIPAIS CUSTOMER_NAME, PHONENUMBER, EMAILADDRESS, ADDRESS, CITY, COUNTRY, POSTALCODE DE CLIENTES

A saída tem a seguinte aparência:


Resumo


Neste artigo eu abordei:
  1. Instrução "Inserir em" e seu uso.
  2. Como salvar a saída da função com valor de tabela em uma tabela SQL.
  3. Como salvar a saída da função com valor de tabela na tabela SQL localizada no servidor remoto usando o Linked Server.