Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como passo valor para um parâmetro de procedimento armazenado no componente OLE DB Source?


Conceitualmente, a aparência da sua solução é executar sua consulta de origem para gerar seu conjunto de resultados. Armazene isso em uma variável e, em seguida, você precisará iterar esses resultados e, para cada linha, chamará seu procedimento armazenado com o valor dessa linha e enviará os resultados para um novo arquivo do Excel.

Eu imaginaria seu pacote parecido com isso

Uma tarefa Executar SQL, chamada "SQL Load Recordset", anexada a um Foreach Loop Container, chamada "FELC Shred Recordset". Aninhada lá dentro, tenho uma tarefa do sistema de arquivos, chamada "FST Copy Template", que é uma precedência para uma tarefa de fluxo de dados, chamada "DFT Generate Output".


Configurar


Como você é iniciante, vou tentar explicar em detalhes. Para evitar problemas, pegue uma cópia do BIDSHelper. É uma ferramenta gratuita e de código aberto que melhora a experiência de design em BIDS/SSDT.

Variáveis


Clique no plano de fundo do seu fluxo de controle. Com nada selecionado, clique com o botão direito do mouse e selecione Variáveis. Na nova janela que aparece, clique no botão que cria uma Nova Variável 4 vezes. A razão para clicar em nada é que até o SQL Server 2012, o comportamento padrão de criação de variáveis ​​é criá-las no escopo do objeto atual. Isso resultou em muitos cabelos perdidos para desenvolvedores novos e experientes. Os nomes de variáveis ​​diferenciam maiúsculas de minúsculas, portanto, esteja ciente disso também.
  1. Renomeie a variável para RecordSet. Altere o tipo de dados de Int32 para Object
  2. Renomeie Variable1 para ParameterValue. Altere o tipo de dados de Int32 para String
  3. Renomeie Variable2 para TemplateFile. Altere o tipo de dados de Int32 para String. Defina o valor para o caminho do seu arquivo Excel de saída. Eu usei C:\ssisdata\ShredRecordset.xlsx
  4. Renomeie a variável 4 para OutputFileName. Altere o tipo de dados de Int32 para String. Aqui vamos fazer algo um pouco avançado. Clique na variável e pressione F4 para abrir a janela Propriedades. Altere o valor de EvaluateAsExpression para True. Em Expressão, defina-o como "C:\\ssisdata\\ShredRecordset." + @[User::ParameterValue] + ".xlsx" (ou qualquer que seja o seu arquivo e caminho). O que isso faz é configurar uma variável para alterar conforme o valor de ParameterValue for alterado. Isso ajuda a garantir que tenhamos um nome de arquivo exclusivo. Você pode alterar a convenção de nomenclatura conforme necessário. Observe que você precisa escapar do \ sempre que estiver em uma expressão.

Gerenciadores de conexão


Eu assumi que você está usando um gerenciador de conexões OLE DB. O meu se chama FOO. Se você estiver usando ADO.NET, os conceitos serão semelhantes, mas haverá nuances relacionadas a parâmetros e tal.

Você também precisará de um segundo Gerenciador de Conexões para lidar com o Excel. Se o SSIS é temperamental em relação aos tipos de dados, o Excel é simplesmente psicótico-apunhala-te-nas-costas-com-um-garfo-enquanto-você-dorme-sobre-tipos de dados. Vamos esperar e deixar o fluxo de dados realmente criar esse Connection Manager para garantir que nossos tipos sejam bons.

Consulta de origem ao conjunto de resultados


O SQL Load Recordset é uma instância da tarefa Executar SQL. Aqui eu tenho uma consulta simples para imitar sua fonte.
SELECT 'aq' AS parameterValue
UNION ALL SELECT 'dr'
UNION ALL SELECT 'tb'



O que é importante observar na guia Geral é que mudei meu ResultSet de None para Full result set . Isso faz com que a guia Conjunto de resultados passe de acinzentada para utilizável.

Você pode observar que atribuí o nome da variável à variável que criamos acima (User::RecordSet) e I o nome do resultado é 0 . Isso é importante como o valor padrão, NewResultName não funciona.

Conjunto de registros de fragmentação FELC


Pegue um Contêiner de Loop Foreach e usaremos isso para "destruir" os resultados que foram gerados na etapa anterior.

Configure o enumerador como um Foreach ADO Enumerator Use User::RecordSet como sua variável de origem do objeto ADO. Selecione rows in the first table como seu modo de enumeração



Na guia Mapeamentos de Variáveis, você precisará selecionar sua variável User::ParameterValue e atribua a ele o Índice de 0. Isso resultará no elemento zerotth em seu objeto de conjunto de registros sendo atribuído à variável ParameterValue. É importante que você tenha um acordo de tipo de dados, pois o SSIS não fará conversões implícitas aqui.


Modelo de cópia FST


Esta é uma tarefa do sistema de arquivos. Vamos copiar nosso modelo de arquivo Excel para que tenhamos um arquivo de saída bem nomeado (com o nome do parâmetro nele). Configure-o como
  • IsDestinationPathVariable:Verdadeiro
  • DestinationVarible:User::OutputFileName
  • OverwriteDestination:Verdadeiro
  • Operação:Copiar arquivo
  • IsSourcePathVariable:Verdadeiro
  • SourceVariable:User::TemplateFile


DFT Gerar Saída


Esta é uma tarefa de fluxo de dados. Estou assumindo que você está apenas despejando os resultados diretamente em um arquivo, então precisaremos apenas de uma fonte OLE DB e um destino do Excel


OLEDB dbo_storedProcedure1


É aqui que seus dados são extraídos de seu sistema de origem com o parâmetro que fragmentamos no fluxo de controle. Vou escrever minha consulta aqui e usar o ? para indicar que tem um parâmetro.

Altere seu modo de acesso a dados para "Comando SQL" e no texto do comando SQL que estiver disponível, coloque sua consulta
EXECUTE dbo.storedProcedure1 ?



Clico no botão Parâmetros... e preencho como mostrado
  • Parâmetros:@parameterValue
  • Variáveis:User::ParameterValue
  • Direção do parâmetro:entrada



Conecte um Destino do Excel à Origem do OLE DB. Clique duas vezes e na seção Gerenciador de Conexões do Excel, clique em Novo... Determine se você está precisando do formato 2003 ou 2007 (.xls vs .xlsx) e se deseja que seu arquivo tenha linhas de cabeçalho. Para o caminho do arquivo, insira o mesmo valor usado para a variável @User::TemplatePath e clique em OK.



Agora precisamos preencher o nome da planilha do Excel. Clique no botão Novo... e ele pode indicar que não há informações suficientes sobre os tipos de dados de mapeamento. Não se preocupe, isso é semi-padrão. Em seguida, aparecerá uma definição de tabela algo como
CREATE TABLE `Excel Destination` (
    `name` NVARCHAR(35),
    `number` INT,
    `type` NVARCHAR(3),
    `low` INT,
    `high` INT,
    `status` INT
)

O nome da "tabela" será o nome da planilha, ou precisamente, o conjunto de dados nomeado na planilha. Eu fiz a minha Sheet1 e cliquei em OK. Agora que a planilha existe, selecione-a no menu suspenso. Eu fui com Sheet1$ como o nome da planilha de destino. Não tenho certeza se isso faz diferença.



Clique na guia Mapeamentos e as coisas devem ser mapeadas automaticamente, então clique em OK.

Finalmente


Neste ponto, se executarmos o pacote, ele substituirá o arquivo de modelo todas as vezes. O segredo é que precisamos dizer que o Excel Connection Manager acabamos de fazer que ele não precisa ter um nome codificado.

Clique uma vez no Gerenciador de Conexões do Excel na guia Gerenciadores de Conexões. Na janela Propriedades, localize as Expressions seção e clique nas reticências ... Aqui vamos configurar a propriedade ExcelFilePath e a Expressão que usaremos é@[User::OutputFileName]

Se seus ícones e outros parecem diferentes, isso é de se esperar. Isso foi documentado usando o SSIS 2012. Seu fluxo de trabalho será o mesmo em 2005 e 2008/2008R2, apenas a aparência é diferente.

Se você executar este pacote e ele nem iniciar e houver um erro sobre o ACE 12 ou Jet 4.0 algo não disponível, você está em uma máquina de 64 bits e precisa informar ao BIDS/SSDT que deseja executar em 32 bits modo.

Certifique-se de que o valor Run64BitRuntime seja False . Esta configuração do projeto pode ser encontrada clicando com o botão direito do mouse no projeto, expandindo as Propriedades de Configuração e será uma opção em Depuração.


Leitura adicional


Um exemplo diferente de fragmentação de um objeto de conjunto de registros pode ser encontrado em Como automatizar a execução de um procedimento armazenado com um pacote SSIS?