{"id":654,"date":"2011-06-23T17:26:29","date_gmt":"2011-06-23T19:26:29","guid":{"rendered":"http:\/\/fabriciolima.net\/blog\/?p=654"},"modified":"2016-07-23T23:19:34","modified_gmt":"2016-07-24T02:19:34","slug":"criando-um-linked-server-do-sql-server-para-o-db2-as400","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2011\/06\/23\/criando-um-linked-server-do-sql-server-para-o-db2-as400\/","title":{"rendered":"Criando um Linked Server do SQL Server para o DB2 AS\/400"},"content":{"rendered":"<p>Fala Pessoal,<\/p>\n<p>Na empresa que trabalho possuo um ambiente SQL Server e um ambiente com um Mainframe AS\/400 da IBM com o SGBD DB2 instalado. Com isso, constantemente precisamos acessar os dados do servidor AS\/400 de dentro do SQL Server e fazemos isso via Linked Server.<\/p>\n<p>Para utilizarmos um provider OLE DB no nosso linked server, deve ser instalado o IBM Client Acess no servidor. Ap\u00f3s essa instala\u00e7\u00e3o \u00e9 disponibilizado o provider &#8220;IBM DB2 UDB for iSeries IBMDA400 OLE DB Provider&#8221;.<\/p>\n<p>Segue abaixo o script de cria\u00e7\u00e3o do LS:<\/p>\n<p>exec sp_addlinkedserver @server=N&#8217;NOME_LINKED_SERVER&#8217;,<br \/>\n@srvproduct=N&#8217;IBM DB2 UDB for iSeries IBMDA400 OLE DB Provider&#8217;,<br \/>\n@provider=N&#8217;IBMDA400&#8242;,<br \/>\n@datasrc=N&#8217;X.X.X.X&#8217;, &#8212; IP do servidor<br \/>\n@catalog=&#8217;CATALOG_SERVIDOR&#8217;,<br \/>\n@provstr=&#8217;Default Collection=NOME_LIBRARY&#8217;<\/p>\n<p>exec\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sp_addlinkedsrvlogin @rmtsrvname=N&#8217;NOME_LINKED_SERVER&#8217;,<br \/>\n@useself=&#8217;false&#8217;,<br \/>\n@rmtuser=N&#8217;USER&#8217;,<br \/>\n@rmtpassword=&#8217;SENHA&#8217;<\/p>\n<p>Em seguida devem ser habilitadas algumas op\u00e7\u00f5es do PROVIDER e do Linked Server para permitir a execu\u00e7\u00e3o de Updates, querys com like dentre outros opera\u00e7\u00f5es.<\/p>\n<p>USE [master]\nGO<br \/>\nEXEC master.dbo.sp_MSset_oledb_prop N&#8217;IBMDA400&#8242;, N&#8217;AllowInProcess&#8217;, 1<br \/>\nGO<br \/>\nEXEC master.dbo.sp_MSset_oledb_prop N&#8217;IBMDA400&#8242;, N&#8217;NonTransactedUpdates&#8217;, 1<br \/>\nGO<br \/>\nEXEC master.dbo.sp_MSset_oledb_prop N&#8217;IBMDA400&#8242;, N&#8217;SqlServerLIKE&#8217;, 1<br \/>\nGO<br \/>\nEXEC master.dbo.sp_serveroption @server=N&#8217;NOME_LINKED_SERVER&#8217;, @optname=N&#8217;collation compatible&#8217;, @optvalue=N&#8217;true&#8217;<br \/>\nGO<br \/>\nEXEC master.dbo.sp_serveroption @server=N&#8217;NOME_LINKED_SERVER&#8217;, @optname=N&#8217;rpc&#8217;, @optvalue=N&#8217;true&#8217;<br \/>\nGO<br \/>\nEXEC master.dbo.sp_serveroption @server=N&#8217;NOME_LINKED_SERVER&#8217;, @optname=N&#8217;rpc out&#8217;, @optvalue=N&#8217;true&#8217;<br \/>\nGO<\/p>\n<p>Com o linked server criado, as seguintes opera\u00e7\u00f5es podem ser realizadas do SQL Server:<\/p>\n<p>Select * From OpenQuery(NOME_LINKED_SERVER,&#8217;Select* FROM LIBRARY.TABLE<br \/>\nFETCH FIRST 1 ROWS ONLY<br \/>\nFOR READ ONLY &#8216; ) As Remote<\/p>\n<p>exec (&#8216;Select * FROM LIBRARY.TABLE<br \/>\nFETCH FIRST 1 ROWS ONLY<br \/>\nFOR READ ONLY &#8216;) AT NOME_LINKED_SERVER<\/p>\n<p>SELECT * FROM NOME_LINKED_SERVER.CATALOG.LIBRARY.TABLE<\/p>\n<p>Para chamar uma procedure do DB2 , deve ser utilizado a seguinte sintaxe:<br \/>\nexec (&#8216;call LIBRARY.NOME_PROCEDURE(?,?)&#8217;,1,&#8217;Fabricio Lima&#8217;) AT NOME_LINKED_SERVER<\/p>\n<p>Essa procedure recebe 1 parametro do tipo INT e um par\u00e2metro VARCHAR.<\/p>\n<p>Podemos tamb\u00e9m inserir e alterar valores via linked server.<br \/>\nINSERT INTO NOME_LINKED_SERVER.CATALOG.LIBRARY.TABLE(Column)<br \/>\nSELECT VALUE<\/p>\n<p>UPDATE NOME_LINKED_SERVER.CATALOG.LIBRARY.TABLE<br \/>\nSET Column = &#8216;TESTE&#8217;<br \/>\nWHERE Column &lt;&gt; &#8216;TESTE<\/p>\n<p>Infelizmente, no DB2 para o AS\/400 n\u00e3o \u00e9 poss\u00edvel realizar um simples UPDATE com JOIN como o que temos abaixo, deve ser utilizado EXISTS para isso.<\/p>\n<p>UPDATE A<br \/>\nSET A.Column = B.Column<br \/>\nFROM TABLE A<br \/>\nJOIN TABLE B ON A.Cod = B.Cod<\/p>\n<p>Entretanto, via Linked Server do SQL Server esse update funciona perfeitamente.<\/p>\n<p>UPDATE A<br \/>\nSET A.Column = B.Column<br \/>\nFROM NOME_LINKED_SERVER.CATALOG.LIBRARY.TABLE A<br \/>\nJOIN NOME_LINKED_SERVER.CATALOG.LIBRARY.TABLE B ON A.Cod = B.Cod<\/p>\n<p>Encontrar esse tipo de material \u00e9 bem dif\u00edcil, se eu encontrasse um post como esse quando comecei a trabalhar com o AS\/400 atrav\u00e9s do SQL Server eu teria adiantado bastante meu trabalho. Ent\u00e3o, espero que agora outras pessoas possam encontrar esse post mais facilmente.<\/p>\n<p><b>Gostou desse Post?<\/b><\/p>\n<p>Cadastre seu e-mail para receber novos Posts e curta minha <a href=\"https:\/\/www.facebook.com\/FabricioLimaSolucoesemBancodeDados\/\" target=\"_blank\">P\u00e1gina no Facebook<\/a> para receber Dicas de Leituras e Eventos sobre SQL Server.<\/p>\n<p>Abra\u00e7os,<\/p>\n<p>Fabr\u00edcio Lima<\/p>\n<p>MCITP \u2013 Database Administrator<\/p>\n<p>Consultor e Instrutor SQL Server<\/p>\n<p>Trabalha com SQL Server desde 2006<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fala Pessoal, Na empresa que trabalho possuo um ambiente SQL Server e um ambiente com um Mainframe AS\/400 da IBM com o SGBD DB2 instalado. Com isso, constantemente precisamos acessar os dados do servidor AS\/400 de dentro do SQL Server e fazemos isso via Linked Server. Para utilizarmos um provider OLE DB no nosso linked [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[3,280],"tags":[285,284,23,308,306,286,305,283,307,304,303,49,33],"class_list":["post-654","post","type-post","status-publish","format-standard","hentry","category-administracao-de-bd","category-virtual-pass-br","tag-as400","tag-db2","tag-dba","tag-exec-at","tag-ibm","tag-ibm-as400","tag-ibm-db2-udb-for-iseries-ibmda400-ole-db-provider","tag-linked-server","tag-openquery","tag-sp_addlinkedserver","tag-sp_addlinkedsrvlogin","tag-sql","tag-sql-server"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/654","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/comments?post=654"}],"version-history":[{"count":0,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/654\/revisions"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=654"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=654"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}