"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[8015],{3905:(e,r,t)=>{t.d(r,{Zo:()=>p,kt:()=>f});var n=t(67294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function a(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?a(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function i(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var c=n.createContext({}),l=function(e){var r=n.useContext(c),t=r;return e&&(t="function"==typeof e?e(r):s(s({},r),e)),t},p=function(e){var r=l(e.components);return n.createElement(c.Provider,{value:r},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},m=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=l(t),m=o,f=d["".concat(c,".").concat(m)]||d[m]||u[m]||a;return t?n.createElement(f,s(s({ref:r},p),{},{components:t})):n.createElement(f,s({ref:r},p))}));function f(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var a=t.length,s=new Array(a);s[0]=m;var i={};for(var c in r)hasOwnProperty.call(r,c)&&(i[c]=r[c]);i.originalType=e,i[d]="string"==typeof e?e:o,s[1]=i;for(var l=2;l<a;l++)s[l]=t[l];return n.createElement.apply(null,s)}return n.createElement.apply(null,t)}m.displayName="MDXCreateElement"},12431:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var n=t(83117),o=(t(67294),t(3905));const a={title:"Microsoft SQL Server",hide_title:!0,sidebar_position:30,version:1},s=void 0,i={unversionedId:"databases/sql-server",id:"databases/sql-server",title:"Microsoft SQL Server",description:"SQL Server",source:"@site/docs/databases/sql-server.mdx",sourceDirName:"databases",slug:"/databases/sql-server",permalink:"/docs/databases/sql-server",draft:!1,editUrl:"https://github.com/apache/superset/tree/master/docs/docs/databases/sql-server.mdx",tags:[],version:"current",sidebarPosition:30,frontMatter:{title:"Microsoft SQL Server",hide_title:!0,sidebar_position:30,version:1},sidebar:"tutorialSidebar",previous:{title:"Snowflake",permalink:"/docs/databases/snowflake"},next:{title:"Teradata",permalink:"/docs/databases/teradata"}},c={},l=[{value:"SQL Server",id:"sql-server",level:2}],p={toc:l},d="wrapper";function u(e){let{components:r,...t}=e;return(0,o.kt)(d,(0,n.Z)({},p,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"sql-server"},"SQL Server"),(0,o.kt)("p",null,"The recommended connector library for SQL Server is ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/pymssql/pymssql"},"pymssql"),"."),(0,o.kt)("p",null,"The connection string for SQL Server looks like this:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"mssql+pymssql://<Username>:<Password>@<Host>:<Port-default:1433>/<Database Name>/?Encrypt=yes\n")),(0,o.kt)("p",null,"It is also possible to connect using ",(0,o.kt)("a",{parentName:"p",href:"https://pypi.org/project/pyodbc"},"pyodbc")," with the parameter ",(0,o.kt)("a",{parentName:"p",href:"https://docs.sqlalchemy.org/en/14/dialects/mssql.html#pass-through-exact-pyodbc-string"},"odbc_connect")),(0,o.kt)("p",null,"The connection string for SQL Server looks like this:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"mssql+pyodbc:///?odbc_connect=Driver%3D%7BODBC+Driver+17+for+SQL+Server%7D%3BServer%3Dtcp%3A%3Cmy_server%3E%2C1433%3BDatabase%3Dmy_database%3BUid%3Dmy_user_name%3BPwd%3Dmy_password%3BEncrypt%3Dyes%3BConnection+Timeout%3D30\n")))}u.isMDXComponent=!0}}]);