Repository files navigation

workflow status badge

mssql.nvim

Logo

An SQL Server plugin for neovim. Like it? Give a ⭐️!

Features

Completions, including TSQL keywords, stored procedures and cross database queries

Tsql keywords screenshot

stored procedures screenshot

Cross db completion

Execute queries, with results in markdown tables for automatic colouring and rendering

queries

Find and generate scripts for tables, views, stored procedures and functions

find objects

User commands and which-key integration

commands

User commands screenshot

Lualine/other status line integration

Which key screenshot

🍒 Other cherries on top:

  • Save query results to csv, json, Excel and xml
  • Backup to/restore from .bak files
  • Basic TSQL formatting

Installation and setup

Requires Neovim v0.11.0 or later.

For keymaps, choose a prefix, eg <leader>m. Make sure it doesn't clash with any existing keymaps/which-key groups!

lazy.nvim
{
"Kurren123/mssql.nvim",
opts= {
-- optionalkeymap_prefix="<leader>m"
},
-- optionaldependencies= { "folke/which-key.nvim" }
}
Packer
require("packer").startup(function()
use({
"Kurren123/mssql.nvim",
-- optionalrequires= { 'folke/which-key.nvim' },
config=function()
require("mssql").setup({ keymap_prefix="<leader>m" })
end,
})
end)
Paq
require("paq")({
"savq/paq-nvim",
"Kurren123/mssql.nvim",
-- optional"folke/which-key.nvim",
})
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})
No package manager

Clone this repo, then:

-- Prepend plugin root to runtimepathvim.opt.rtp:prepend("/path/to/mssql.nvim/")
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})

All mssql keymaps are set up with the prefix first. In the above example, new query would be <leader>mn. If you have which-key installed, then the prefix you provide will be a which-key group.

Lualine

Insert require("mssql").lualine_component into a lualine section (eg lualine_c).

Eg lazyvim:

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts=function(_, opts)
table.insert(opts.sections.lualine_c, require("mssql").lualine_component)
returnoptsend,
}

Or Lazy.nvim (without lazyvim):

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts= {
sections= {
lualine_c= {
require('mssql').lualine_component,
},
},
},
}

Other status lines (eg heirline)

You can also use require('mssql').lualine_component in other status lines or customise your own (see Kurren123#56 (comment)). It's a table with the following:

{
[1] =function()
-- returns a string of the statusend,
cond=function()
-- returns a bool, of whether to show this status lineend
}

So eg a heirline component would look like:

locallualine_component=require("mssql").lualine_componentlocalmssql_heirline_component= {
provider=lualine_component[1],
condition=lualine_component.cond,
}

mssql.nvim calls vim.cmd("redrawstatus") whenever the status changes, so you don't need to worry about refreshing

Using a keymap that gets overridden later (eg lazyvim)

Lazyvim sets its keymaps after loading the mssql plugin. If you want to use a keymap that lazyvim already uses:

  1. Call setup() without a keymap_prefix

  2. In your keymaps.lua file, delete the lazyvim keymaps then call set_keymaps. Eg:

    -- delete lua profiler keymaps firstsafe_delete("n", "<leader>dpp")
    safe_delete("n", "<leader>dph")
    safe_delete("n", "<leader>dps")
    require("mssql").set_keymaps("<leader>d")

Usage

You can call the following as key maps typing your prefix first, as user commands by doing :MSSQL <command> or as functions on require("mssql").

Key MapUser CommandFunctionDescription
nNewQuerynew_query()Open a new buffer for sql queries
cConnectconnect()Connect the current buffer (you'll be prompted to choose a connection)
xExecuteQueryexecute_query()Execute the selection, or the whole buffer. If you are disconnected, it will try to connect to the default connection in your connections.json.
fFindfind_object()Find a table/view/stored procedure/function and generate a script
lCancelQuerycancel_query()Cancel the currently running query.
qDisconnectdisconnect()Disconnects the current buffer
sSwitchDatabaseswitch_database()Prompts, then switches to a database that is on the currently connected server
dNewDefaultQuerynew_default_query()Opens a new query and connects to the connection called default in your connections.json. Useful when combined with the promptForDatabase option in the connections.json.
sSaveQueryResultssave_query_results()When in a query result buffer, save the query result by giving a file path with an extension of .csv, .json, .xml, .xlsx or .xls
rRefreshCacherefresh_cache()Rebuild the intellisense and sql object (used for the Find function) caches
eEditConnectionsedit_connections()Open the connections file for editing
BackupDatabasebackup_database()Inserts an SQL command to back up the currently connected database
RestoreDatabaserestore_database()Prompts for a .bak file, then inserts an SQL command to restore the database from that file

Connections json file

The format is "connection name": connection object. Eg:

{
"Connection A": {
"server": "localhost",
"database": "dbA",
"authenticationType": "SqlLogin",
"user": "Admin",
"password": "Your_Password",
"trustServerCertificate": true
},
"Connection B": {
"server": "AnotherServer",
"database": "dbB",
"authenticationType": "Integrated",
"promptForDatabase": true
}
}

Each connection object takes standard connection properties. On top of those, you can also provide these useful properties:

PropertyTypeDescription
promptForDatabaseboolAfter connecting to the server, select which database to connect to.
promptForPasswordboolAsk for the password each time you connect instead of storing it in the json file

Options

Setup with options:

require("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50
})
-- With callbackrequire("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50,
}, function()
print("mssql.nvim is ready!")
end)

See here for all options and defaults

Notes

  • setup() runs asynchronously as it may take some time to first download and extract the sql tools. Pass a callback as the second argument if you need to run code after initialization.
  • Formatting options are passed into the option's lsp_settings

Supporting this project

I don't take personal donations as I feel like it ruins the fun. However, if you've already given a ⭐ and want to support this project further, please consider donating to the mssql.nvim fundraising page for Cancer Research UK.

Cancer research uk logo

Cancer affects millions of lives every year. Any research we can do into beating it also has knock-on effects on enhancing our understanding of other diseases. Seeing anyone donate will make this project worth it.

About

A Microsoft SQL Server plugin for neovim

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

workflow status badge

mssql.nvim

Logo

An SQL Server plugin for neovim. Like it? Give a ⭐️!

Features

Completions, including TSQL keywords, stored procedures and cross database queries

Tsql keywords screenshot

stored procedures screenshot

Cross db completion

Execute queries, with results in markdown tables for automatic colouring and rendering

queries

Find and generate scripts for tables, views, stored procedures and functions

find objects

User commands and which-key integration

commands

User commands screenshot

Lualine/other status line integration

Which key screenshot

🍒 Other cherries on top:

  • Save query results to csv, json, Excel and xml
  • Backup to/restore from .bak files
  • Basic TSQL formatting

Installation and setup

Requires Neovim v0.11.0 or later.

For keymaps, choose a prefix, eg <leader>m. Make sure it doesn't clash with any existing keymaps/which-key groups!

lazy.nvim
{
"Kurren123/mssql.nvim",
opts= {
-- optionalkeymap_prefix="<leader>m"
},
-- optionaldependencies= { "folke/which-key.nvim" }
}
Packer
require("packer").startup(function()
use({
"Kurren123/mssql.nvim",
-- optionalrequires= { 'folke/which-key.nvim' },
config=function()
require("mssql").setup({ keymap_prefix="<leader>m" })
end,
})
end)
Paq
require("paq")({
"savq/paq-nvim",
"Kurren123/mssql.nvim",
-- optional"folke/which-key.nvim",
})
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})
No package manager

Clone this repo, then:

-- Prepend plugin root to runtimepathvim.opt.rtp:prepend("/path/to/mssql.nvim/")
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})

All mssql keymaps are set up with the prefix first. In the above example, new query would be <leader>mn. If you have which-key installed, then the prefix you provide will be a which-key group.

Lualine

Insert require("mssql").lualine_component into a lualine section (eg lualine_c).

Eg lazyvim:

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts=function(_, opts)
table.insert(opts.sections.lualine_c, require("mssql").lualine_component)
returnoptsend,
}

Or Lazy.nvim (without lazyvim):

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts= {
sections= {
lualine_c= {
require('mssql').lualine_component,
},
},
},
}

Other status lines (eg heirline)

You can also use require('mssql').lualine_component in other status lines or customise your own (see Kurren123#56 (comment)). It's a table with the following:

{
[1] =function()
-- returns a string of the statusend,
cond=function()
-- returns a bool, of whether to show this status lineend
}

So eg a heirline component would look like:

locallualine_component=require("mssql").lualine_componentlocalmssql_heirline_component= {
provider=lualine_component[1],
condition=lualine_component.cond,
}

mssql.nvim calls vim.cmd("redrawstatus") whenever the status changes, so you don't need to worry about refreshing

Using a keymap that gets overridden later (eg lazyvim)

Lazyvim sets its keymaps after loading the mssql plugin. If you want to use a keymap that lazyvim already uses:

  1. Call setup() without a keymap_prefix

  2. In your keymaps.lua file, delete the lazyvim keymaps then call set_keymaps. Eg:

    -- delete lua profiler keymaps firstsafe_delete("n", "<leader>dpp")
    safe_delete("n", "<leader>dph")
    safe_delete("n", "<leader>dps")
    require("mssql").set_keymaps("<leader>d")

Usage

You can call the following as key maps typing your prefix first, as user commands by doing :MSSQL <command> or as functions on require("mssql").

Key MapUser CommandFunctionDescription
nNewQuerynew_query()Open a new buffer for sql queries
cConnectconnect()Connect the current buffer (you'll be prompted to choose a connection)
xExecuteQueryexecute_query()Execute the selection, or the whole buffer. If you are disconnected, it will try to connect to the default connection in your connections.json.
fFindfind_object()Find a table/view/stored procedure/function and generate a script
lCancelQuerycancel_query()Cancel the currently running query.
qDisconnectdisconnect()Disconnects the current buffer
sSwitchDatabaseswitch_database()Prompts, then switches to a database that is on the currently connected server
dNewDefaultQuerynew_default_query()Opens a new query and connects to the connection called default in your connections.json. Useful when combined with the promptForDatabase option in the connections.json.
sSaveQueryResultssave_query_results()When in a query result buffer, save the query result by giving a file path with an extension of .csv, .json, .xml, .xlsx or .xls
rRefreshCacherefresh_cache()Rebuild the intellisense and sql object (used for the Find function) caches
eEditConnectionsedit_connections()Open the connections file for editing
BackupDatabasebackup_database()Inserts an SQL command to back up the currently connected database
RestoreDatabaserestore_database()Prompts for a .bak file, then inserts an SQL command to restore the database from that file

Connections json file

The format is "connection name": connection object. Eg:

{
"Connection A": {
"server": "localhost",
"database": "dbA",
"authenticationType": "SqlLogin",
"user": "Admin",
"password": "Your_Password",
"trustServerCertificate": true
},
"Connection B": {
"server": "AnotherServer",
"database": "dbB",
"authenticationType": "Integrated",
"promptForDatabase": true
}
}

Each connection object takes standard connection properties. On top of those, you can also provide these useful properties:

PropertyTypeDescription
promptForDatabaseboolAfter connecting to the server, select which database to connect to.
promptForPasswordboolAsk for the password each time you connect instead of storing it in the json file

Options

Setup with options:

require("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50
})
-- With callbackrequire("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50,
}, function()
print("mssql.nvim is ready!")
end)

See here for all options and defaults

Notes

  • setup() runs asynchronously as it may take some time to first download and extract the sql tools. Pass a callback as the second argument if you need to run code after initialization.
  • Formatting options are passed into the option's lsp_settings

Supporting this project

I don't take personal donations as I feel like it ruins the fun. However, if you've already given a ⭐ and want to support this project further, please consider donating to the mssql.nvim fundraising page for Cancer Research UK.

Cancer research uk logo

Cancer affects millions of lives every year. Any research we can do into beating it also has knock-on effects on enhancing our understanding of other diseases. Seeing anyone donate will make this project worth it.

About

A Microsoft SQL Server plugin for neovim

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

workflow status badge

mssql.nvim

Logo

An SQL Server plugin for neovim. Like it? Give a ⭐️!

Features

Completions, including TSQL keywords, stored procedures and cross database queries

Tsql keywords screenshot

stored procedures screenshot

Cross db completion

Execute queries, with results in markdown tables for automatic colouring and rendering

queries

Find and generate scripts for tables, views, stored procedures and functions

find objects

User commands and which-key integration

commands

User commands screenshot

Lualine/other status line integration

Which key screenshot

🍒 Other cherries on top:

  • Save query results to csv, json, Excel and xml
  • Backup to/restore from .bak files
  • Basic TSQL formatting

Installation and setup

Requires Neovim v0.11.0 or later.

For keymaps, choose a prefix, eg <leader>m. Make sure it doesn't clash with any existing keymaps/which-key groups!

lazy.nvim
{
"Kurren123/mssql.nvim",
opts= {
-- optionalkeymap_prefix="<leader>m"
},
-- optionaldependencies= { "folke/which-key.nvim" }
}
Packer
require("packer").startup(function()
use({
"Kurren123/mssql.nvim",
-- optionalrequires= { 'folke/which-key.nvim' },
config=function()
require("mssql").setup({ keymap_prefix="<leader>m" })
end,
})
end)
Paq
require("paq")({
"savq/paq-nvim",
"Kurren123/mssql.nvim",
-- optional"folke/which-key.nvim",
})
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})
No package manager

Clone this repo, then:

-- Prepend plugin root to runtimepathvim.opt.rtp:prepend("/path/to/mssql.nvim/")
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})

All mssql keymaps are set up with the prefix first. In the above example, new query would be <leader>mn. If you have which-key installed, then the prefix you provide will be a which-key group.

Lualine

Insert require("mssql").lualine_component into a lualine section (eg lualine_c).

Eg lazyvim:

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts=function(_, opts)
table.insert(opts.sections.lualine_c, require("mssql").lualine_component)
returnoptsend,
}

Or Lazy.nvim (without lazyvim):

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts= {
sections= {
lualine_c= {
require('mssql').lualine_component,
},
},
},
}

Other status lines (eg heirline)

You can also use require('mssql').lualine_component in other status lines or customise your own (see Kurren123#56 (comment)). It's a table with the following:

{
[1] =function()
-- returns a string of the statusend,
cond=function()
-- returns a bool, of whether to show this status lineend
}

So eg a heirline component would look like:

locallualine_component=require("mssql").lualine_componentlocalmssql_heirline_component= {
provider=lualine_component[1],
condition=lualine_component.cond,
}

mssql.nvim calls vim.cmd("redrawstatus") whenever the status changes, so you don't need to worry about refreshing

Using a keymap that gets overridden later (eg lazyvim)

Lazyvim sets its keymaps after loading the mssql plugin. If you want to use a keymap that lazyvim already uses:

  1. Call setup() without a keymap_prefix

  2. In your keymaps.lua file, delete the lazyvim keymaps then call set_keymaps. Eg:

    -- delete lua profiler keymaps firstsafe_delete("n", "<leader>dpp")
    safe_delete("n", "<leader>dph")
    safe_delete("n", "<leader>dps")
    require("mssql").set_keymaps("<leader>d")

Usage

You can call the following as key maps typing your prefix first, as user commands by doing :MSSQL <command> or as functions on require("mssql").

Key MapUser CommandFunctionDescription
nNewQuerynew_query()Open a new buffer for sql queries
cConnectconnect()Connect the current buffer (you'll be prompted to choose a connection)
xExecuteQueryexecute_query()Execute the selection, or the whole buffer. If you are disconnected, it will try to connect to the default connection in your connections.json.
fFindfind_object()Find a table/view/stored procedure/function and generate a script
lCancelQuerycancel_query()Cancel the currently running query.
qDisconnectdisconnect()Disconnects the current buffer
sSwitchDatabaseswitch_database()Prompts, then switches to a database that is on the currently connected server
dNewDefaultQuerynew_default_query()Opens a new query and connects to the connection called default in your connections.json. Useful when combined with the promptForDatabase option in the connections.json.
sSaveQueryResultssave_query_results()When in a query result buffer, save the query result by giving a file path with an extension of .csv, .json, .xml, .xlsx or .xls
rRefreshCacherefresh_cache()Rebuild the intellisense and sql object (used for the Find function) caches
eEditConnectionsedit_connections()Open the connections file for editing
BackupDatabasebackup_database()Inserts an SQL command to back up the currently connected database
RestoreDatabaserestore_database()Prompts for a .bak file, then inserts an SQL command to restore the database from that file

Connections json file

The format is "connection name": connection object. Eg:

{
"Connection A": {
"server": "localhost",
"database": "dbA",
"authenticationType": "SqlLogin",
"user": "Admin",
"password": "Your_Password",
"trustServerCertificate": true
},
"Connection B": {
"server": "AnotherServer",
"database": "dbB",
"authenticationType": "Integrated",
"promptForDatabase": true
}
}

Each connection object takes standard connection properties. On top of those, you can also provide these useful properties:

PropertyTypeDescription
promptForDatabaseboolAfter connecting to the server, select which database to connect to.
promptForPasswordboolAsk for the password each time you connect instead of storing it in the json file

Options

Setup with options:

require("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50
})
-- With callbackrequire("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50,
}, function()
print("mssql.nvim is ready!")
end)

See here for all options and defaults

Notes

  • setup() runs asynchronously as it may take some time to first download and extract the sql tools. Pass a callback as the second argument if you need to run code after initialization.
  • Formatting options are passed into the option's lsp_settings

Supporting this project

I don't take personal donations as I feel like it ruins the fun. However, if you've already given a ⭐ and want to support this project further, please consider donating to the mssql.nvim fundraising page for Cancer Research UK.

Cancer research uk logo

Cancer affects millions of lives every year. Any research we can do into beating it also has knock-on effects on enhancing our understanding of other diseases. Seeing anyone donate will make this project worth it.

About

A Microsoft SQL Server plugin for neovim

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

workflow status badge

mssql.nvim

Logo

An SQL Server plugin for neovim. Like it? Give a ⭐️!

Features

Completions, including TSQL keywords, stored procedures and cross database queries

Tsql keywords screenshot

stored procedures screenshot

Cross db completion

Execute queries, with results in markdown tables for automatic colouring and rendering

queries

Find and generate scripts for tables, views, stored procedures and functions

find objects

User commands and which-key integration

commands

User commands screenshot

Lualine/other status line integration

Which key screenshot

🍒 Other cherries on top:

  • Save query results to csv, json, Excel and xml
  • Backup to/restore from .bak files
  • Basic TSQL formatting

Installation and setup

Requires Neovim v0.11.0 or later.

For keymaps, choose a prefix, eg <leader>m. Make sure it doesn't clash with any existing keymaps/which-key groups!

lazy.nvim
{
"Kurren123/mssql.nvim",
opts= {
-- optionalkeymap_prefix="<leader>m"
},
-- optionaldependencies= { "folke/which-key.nvim" }
}
Packer
require("packer").startup(function()
use({
"Kurren123/mssql.nvim",
-- optionalrequires= { 'folke/which-key.nvim' },
config=function()
require("mssql").setup({ keymap_prefix="<leader>m" })
end,
})
end)
Paq
require("paq")({
"savq/paq-nvim",
"Kurren123/mssql.nvim",
-- optional"folke/which-key.nvim",
})
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})
No package manager

Clone this repo, then:

-- Prepend plugin root to runtimepathvim.opt.rtp:prepend("/path/to/mssql.nvim/")
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})

All mssql keymaps are set up with the prefix first. In the above example, new query would be <leader>mn. If you have which-key installed, then the prefix you provide will be a which-key group.

Lualine

Insert require("mssql").lualine_component into a lualine section (eg lualine_c).

Eg lazyvim:

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts=function(_, opts)
table.insert(opts.sections.lualine_c, require("mssql").lualine_component)
returnoptsend,
}

Or Lazy.nvim (without lazyvim):

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts= {
sections= {
lualine_c= {
require('mssql').lualine_component,
},
},
},
}

Other status lines (eg heirline)

You can also use require('mssql').lualine_component in other status lines or customise your own (see Kurren123#56 (comment)). It's a table with the following:

{
[1] =function()
-- returns a string of the statusend,
cond=function()
-- returns a bool, of whether to show this status lineend
}

So eg a heirline component would look like:

locallualine_component=require("mssql").lualine_componentlocalmssql_heirline_component= {
provider=lualine_component[1],
condition=lualine_component.cond,
}

mssql.nvim calls vim.cmd("redrawstatus") whenever the status changes, so you don't need to worry about refreshing

Using a keymap that gets overridden later (eg lazyvim)

Lazyvim sets its keymaps after loading the mssql plugin. If you want to use a keymap that lazyvim already uses:

  1. Call setup() without a keymap_prefix

  2. In your keymaps.lua file, delete the lazyvim keymaps then call set_keymaps. Eg:

    -- delete lua profiler keymaps firstsafe_delete("n", "<leader>dpp")
    safe_delete("n", "<leader>dph")
    safe_delete("n", "<leader>dps")
    require("mssql").set_keymaps("<leader>d")

Usage

You can call the following as key maps typing your prefix first, as user commands by doing :MSSQL <command> or as functions on require("mssql").

Key MapUser CommandFunctionDescription
nNewQuerynew_query()Open a new buffer for sql queries
cConnectconnect()Connect the current buffer (you'll be prompted to choose a connection)
xExecuteQueryexecute_query()Execute the selection, or the whole buffer. If you are disconnected, it will try to connect to the default connection in your connections.json.
fFindfind_object()Find a table/view/stored procedure/function and generate a script
lCancelQuerycancel_query()Cancel the currently running query.
qDisconnectdisconnect()Disconnects the current buffer
sSwitchDatabaseswitch_database()Prompts, then switches to a database that is on the currently connected server
dNewDefaultQuerynew_default_query()Opens a new query and connects to the connection called default in your connections.json. Useful when combined with the promptForDatabase option in the connections.json.
sSaveQueryResultssave_query_results()When in a query result buffer, save the query result by giving a file path with an extension of .csv, .json, .xml, .xlsx or .xls
rRefreshCacherefresh_cache()Rebuild the intellisense and sql object (used for the Find function) caches
eEditConnectionsedit_connections()Open the connections file for editing
BackupDatabasebackup_database()Inserts an SQL command to back up the currently connected database
RestoreDatabaserestore_database()Prompts for a .bak file, then inserts an SQL command to restore the database from that file

Connections json file

The format is "connection name": connection object. Eg:

{
"Connection A": {
"server": "localhost",
"database": "dbA",
"authenticationType": "SqlLogin",
"user": "Admin",
"password": "Your_Password",
"trustServerCertificate": true
},
"Connection B": {
"server": "AnotherServer",
"database": "dbB",
"authenticationType": "Integrated",
"promptForDatabase": true
}
}

Each connection object takes standard connection properties. On top of those, you can also provide these useful properties:

PropertyTypeDescription
promptForDatabaseboolAfter connecting to the server, select which database to connect to.
promptForPasswordboolAsk for the password each time you connect instead of storing it in the json file

Options

Setup with options:

require("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50
})
-- With callbackrequire("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50,
}, function()
print("mssql.nvim is ready!")
end)

See here for all options and defaults

Notes

  • setup() runs asynchronously as it may take some time to first download and extract the sql tools. Pass a callback as the second argument if you need to run code after initialization.
  • Formatting options are passed into the option's lsp_settings

Supporting this project

I don't take personal donations as I feel like it ruins the fun. However, if you've already given a ⭐ and want to support this project further, please consider donating to the mssql.nvim fundraising page for Cancer Research UK.

Cancer research uk logo

Cancer affects millions of lives every year. Any research we can do into beating it also has knock-on effects on enhancing our understanding of other diseases. Seeing anyone donate will make this project worth it.

About

A Microsoft SQL Server plugin for neovim

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

workflow status badge

mssql.nvim

Logo

An SQL Server plugin for neovim. Like it? Give a ⭐️!

Features

Completions, including TSQL keywords, stored procedures and cross database queries

Tsql keywords screenshot

stored procedures screenshot

Cross db completion

Execute queries, with results in markdown tables for automatic colouring and rendering

queries

Find and generate scripts for tables, views, stored procedures and functions

find objects

User commands and which-key integration

commands

User commands screenshot

Lualine/other status line integration

Which key screenshot

🍒 Other cherries on top:

  • Save query results to csv, json, Excel and xml
  • Backup to/restore from .bak files
  • Basic TSQL formatting

Installation and setup

Requires Neovim v0.11.0 or later.

For keymaps, choose a prefix, eg <leader>m. Make sure it doesn't clash with any existing keymaps/which-key groups!

lazy.nvim
{
"Kurren123/mssql.nvim",
opts= {
-- optionalkeymap_prefix="<leader>m"
},
-- optionaldependencies= { "folke/which-key.nvim" }
}
Packer
require("packer").startup(function()
use({
"Kurren123/mssql.nvim",
-- optionalrequires= { 'folke/which-key.nvim' },
config=function()
require("mssql").setup({ keymap_prefix="<leader>m" })
end,
})
end)
Paq
require("paq")({
"savq/paq-nvim",
"Kurren123/mssql.nvim",
-- optional"folke/which-key.nvim",
})
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})
No package manager

Clone this repo, then:

-- Prepend plugin root to runtimepathvim.opt.rtp:prepend("/path/to/mssql.nvim/")
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})

All mssql keymaps are set up with the prefix first. In the above example, new query would be <leader>mn. If you have which-key installed, then the prefix you provide will be a which-key group.

Lualine

Insert require("mssql").lualine_component into a lualine section (eg lualine_c).

Eg lazyvim:

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts=function(_, opts)
table.insert(opts.sections.lualine_c, require("mssql").lualine_component)
returnoptsend,
}

Or Lazy.nvim (without lazyvim):

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts= {
sections= {
lualine_c= {
require('mssql').lualine_component,
},
},
},
}

Other status lines (eg heirline)

You can also use require('mssql').lualine_component in other status lines or customise your own (see Kurren123#56 (comment)). It's a table with the following:

{
[1] =function()
-- returns a string of the statusend,
cond=function()
-- returns a bool, of whether to show this status lineend
}

So eg a heirline component would look like:

locallualine_component=require("mssql").lualine_componentlocalmssql_heirline_component= {
provider=lualine_component[1],
condition=lualine_component.cond,
}

mssql.nvim calls vim.cmd("redrawstatus") whenever the status changes, so you don't need to worry about refreshing

Using a keymap that gets overridden later (eg lazyvim)

Lazyvim sets its keymaps after loading the mssql plugin. If you want to use a keymap that lazyvim already uses:

  1. Call setup() without a keymap_prefix

  2. In your keymaps.lua file, delete the lazyvim keymaps then call set_keymaps. Eg:

    -- delete lua profiler keymaps firstsafe_delete("n", "<leader>dpp")
    safe_delete("n", "<leader>dph")
    safe_delete("n", "<leader>dps")
    require("mssql").set_keymaps("<leader>d")

Usage

You can call the following as key maps typing your prefix first, as user commands by doing :MSSQL <command> or as functions on require("mssql").

Key MapUser CommandFunctionDescription
nNewQuerynew_query()Open a new buffer for sql queries
cConnectconnect()Connect the current buffer (you'll be prompted to choose a connection)
xExecuteQueryexecute_query()Execute the selection, or the whole buffer. If you are disconnected, it will try to connect to the default connection in your connections.json.
fFindfind_object()Find a table/view/stored procedure/function and generate a script
lCancelQuerycancel_query()Cancel the currently running query.
qDisconnectdisconnect()Disconnects the current buffer
sSwitchDatabaseswitch_database()Prompts, then switches to a database that is on the currently connected server
dNewDefaultQuerynew_default_query()Opens a new query and connects to the connection called default in your connections.json. Useful when combined with the promptForDatabase option in the connections.json.
sSaveQueryResultssave_query_results()When in a query result buffer, save the query result by giving a file path with an extension of .csv, .json, .xml, .xlsx or .xls
rRefreshCacherefresh_cache()Rebuild the intellisense and sql object (used for the Find function) caches
eEditConnectionsedit_connections()Open the connections file for editing
BackupDatabasebackup_database()Inserts an SQL command to back up the currently connected database
RestoreDatabaserestore_database()Prompts for a .bak file, then inserts an SQL command to restore the database from that file

Connections json file

The format is "connection name": connection object. Eg:

{
"Connection A": {
"server": "localhost",
"database": "dbA",
"authenticationType": "SqlLogin",
"user": "Admin",
"password": "Your_Password",
"trustServerCertificate": true
},
"Connection B": {
"server": "AnotherServer",
"database": "dbB",
"authenticationType": "Integrated",
"promptForDatabase": true
}
}

Each connection object takes standard connection properties. On top of those, you can also provide these useful properties:

PropertyTypeDescription
promptForDatabaseboolAfter connecting to the server, select which database to connect to.
promptForPasswordboolAsk for the password each time you connect instead of storing it in the json file

Options

Setup with options:

require("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50
})
-- With callbackrequire("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50,
}, function()
print("mssql.nvim is ready!")
end)

See here for all options and defaults

Notes

  • setup() runs asynchronously as it may take some time to first download and extract the sql tools. Pass a callback as the second argument if you need to run code after initialization.
  • Formatting options are passed into the option's lsp_settings

Supporting this project

I don't take personal donations as I feel like it ruins the fun. However, if you've already given a ⭐ and want to support this project further, please consider donating to the mssql.nvim fundraising page for Cancer Research UK.

Cancer research uk logo

Cancer affects millions of lives every year. Any research we can do into beating it also has knock-on effects on enhancing our understanding of other diseases. Seeing anyone donate will make this project worth it.

About

A Microsoft SQL Server plugin for neovim

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

workflow status badge

mssql.nvim

Logo

An SQL Server plugin for neovim. Like it? Give a ⭐️!

Features

Completions, including TSQL keywords, stored procedures and cross database queries

Tsql keywords screenshot

stored procedures screenshot

Cross db completion

Execute queries, with results in markdown tables for automatic colouring and rendering

queries

Find and generate scripts for tables, views, stored procedures and functions

find objects

User commands and which-key integration

commands

User commands screenshot

Lualine/other status line integration

Which key screenshot

🍒 Other cherries on top:

  • Save query results to csv, json, Excel and xml
  • Backup to/restore from .bak files
  • Basic TSQL formatting

Installation and setup

Requires Neovim v0.11.0 or later.

For keymaps, choose a prefix, eg <leader>m. Make sure it doesn't clash with any existing keymaps/which-key groups!

lazy.nvim
{
"Kurren123/mssql.nvim",
opts= {
-- optionalkeymap_prefix="<leader>m"
},
-- optionaldependencies= { "folke/which-key.nvim" }
}
Packer
require("packer").startup(function()
use({
"Kurren123/mssql.nvim",
-- optionalrequires= { 'folke/which-key.nvim' },
config=function()
require("mssql").setup({ keymap_prefix="<leader>m" })
end,
})
end)
Paq
require("paq")({
"savq/paq-nvim",
"Kurren123/mssql.nvim",
-- optional"folke/which-key.nvim",
})
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})
No package manager

Clone this repo, then:

-- Prepend plugin root to runtimepathvim.opt.rtp:prepend("/path/to/mssql.nvim/")
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})

All mssql keymaps are set up with the prefix first. In the above example, new query would be <leader>mn. If you have which-key installed, then the prefix you provide will be a which-key group.

Lualine

Insert require("mssql").lualine_component into a lualine section (eg lualine_c).

Eg lazyvim:

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts=function(_, opts)
table.insert(opts.sections.lualine_c, require("mssql").lualine_component)
returnoptsend,
}

Or Lazy.nvim (without lazyvim):

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts= {
sections= {
lualine_c= {
require('mssql').lualine_component,
},
},
},
}

Other status lines (eg heirline)

You can also use require('mssql').lualine_component in other status lines or customise your own (see Kurren123#56 (comment)). It's a table with the following:

{
[1] =function()
-- returns a string of the statusend,
cond=function()
-- returns a bool, of whether to show this status lineend
}

So eg a heirline component would look like:

locallualine_component=require("mssql").lualine_componentlocalmssql_heirline_component= {
provider=lualine_component[1],
condition=lualine_component.cond,
}

mssql.nvim calls vim.cmd("redrawstatus") whenever the status changes, so you don't need to worry about refreshing

Using a keymap that gets overridden later (eg lazyvim)

Lazyvim sets its keymaps after loading the mssql plugin. If you want to use a keymap that lazyvim already uses:

  1. Call setup() without a keymap_prefix

  2. In your keymaps.lua file, delete the lazyvim keymaps then call set_keymaps. Eg:

    -- delete lua profiler keymaps firstsafe_delete("n", "<leader>dpp")
    safe_delete("n", "<leader>dph")
    safe_delete("n", "<leader>dps")
    require("mssql").set_keymaps("<leader>d")

Usage

You can call the following as key maps typing your prefix first, as user commands by doing :MSSQL <command> or as functions on require("mssql").

Key MapUser CommandFunctionDescription
nNewQuerynew_query()Open a new buffer for sql queries
cConnectconnect()Connect the current buffer (you'll be prompted to choose a connection)
xExecuteQueryexecute_query()Execute the selection, or the whole buffer. If you are disconnected, it will try to connect to the default connection in your connections.json.
fFindfind_object()Find a table/view/stored procedure/function and generate a script
lCancelQuerycancel_query()Cancel the currently running query.
qDisconnectdisconnect()Disconnects the current buffer
sSwitchDatabaseswitch_database()Prompts, then switches to a database that is on the currently connected server
dNewDefaultQuerynew_default_query()Opens a new query and connects to the connection called default in your connections.json. Useful when combined with the promptForDatabase option in the connections.json.
sSaveQueryResultssave_query_results()When in a query result buffer, save the query result by giving a file path with an extension of .csv, .json, .xml, .xlsx or .xls
rRefreshCacherefresh_cache()Rebuild the intellisense and sql object (used for the Find function) caches
eEditConnectionsedit_connections()Open the connections file for editing
BackupDatabasebackup_database()Inserts an SQL command to back up the currently connected database
RestoreDatabaserestore_database()Prompts for a .bak file, then inserts an SQL command to restore the database from that file

Connections json file

The format is "connection name": connection object. Eg:

{
"Connection A": {
"server": "localhost",
"database": "dbA",
"authenticationType": "SqlLogin",
"user": "Admin",
"password": "Your_Password",
"trustServerCertificate": true
},
"Connection B": {
"server": "AnotherServer",
"database": "dbB",
"authenticationType": "Integrated",
"promptForDatabase": true
}
}

Each connection object takes standard connection properties. On top of those, you can also provide these useful properties:

PropertyTypeDescription
promptForDatabaseboolAfter connecting to the server, select which database to connect to.
promptForPasswordboolAsk for the password each time you connect instead of storing it in the json file

Options

Setup with options:

require("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50
})
-- With callbackrequire("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50,
}, function()
print("mssql.nvim is ready!")
end)

See here for all options and defaults

Notes

  • setup() runs asynchronously as it may take some time to first download and extract the sql tools. Pass a callback as the second argument if you need to run code after initialization.
  • Formatting options are passed into the option's lsp_settings

Supporting this project

I don't take personal donations as I feel like it ruins the fun. However, if you've already given a ⭐ and want to support this project further, please consider donating to the mssql.nvim fundraising page for Cancer Research UK.

Cancer research uk logo

Cancer affects millions of lives every year. Any research we can do into beating it also has knock-on effects on enhancing our understanding of other diseases. Seeing anyone donate will make this project worth it.

About

A Microsoft SQL Server plugin for neovim

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

workflow status badge

mssql.nvim

Logo

An SQL Server plugin for neovim. Like it? Give a ⭐️!

Features

Completions, including TSQL keywords, stored procedures and cross database queries

Tsql keywords screenshot

stored procedures screenshot

Cross db completion

Execute queries, with results in markdown tables for automatic colouring and rendering

queries

Find and generate scripts for tables, views, stored procedures and functions

find objects

User commands and which-key integration

commands

User commands screenshot

Lualine/other status line integration

Which key screenshot

🍒 Other cherries on top:

  • Save query results to csv, json, Excel and xml
  • Backup to/restore from .bak files
  • Basic TSQL formatting

Installation and setup

Requires Neovim v0.11.0 or later.

For keymaps, choose a prefix, eg <leader>m. Make sure it doesn't clash with any existing keymaps/which-key groups!

lazy.nvim
{
"Kurren123/mssql.nvim",
opts= {
-- optionalkeymap_prefix="<leader>m"
},
-- optionaldependencies= { "folke/which-key.nvim" }
}
Packer
require("packer").startup(function()
use({
"Kurren123/mssql.nvim",
-- optionalrequires= { 'folke/which-key.nvim' },
config=function()
require("mssql").setup({ keymap_prefix="<leader>m" })
end,
})
end)
Paq
require("paq")({
"savq/paq-nvim",
"Kurren123/mssql.nvim",
-- optional"folke/which-key.nvim",
})
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})
No package manager

Clone this repo, then:

-- Prepend plugin root to runtimepathvim.opt.rtp:prepend("/path/to/mssql.nvim/")
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})

All mssql keymaps are set up with the prefix first. In the above example, new query would be <leader>mn. If you have which-key installed, then the prefix you provide will be a which-key group.

Lualine

Insert require("mssql").lualine_component into a lualine section (eg lualine_c).

Eg lazyvim:

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts=function(_, opts)
table.insert(opts.sections.lualine_c, require("mssql").lualine_component)
returnoptsend,
}

Or Lazy.nvim (without lazyvim):

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts= {
sections= {
lualine_c= {
require('mssql').lualine_component,
},
},
},
}

Other status lines (eg heirline)

You can also use require('mssql').lualine_component in other status lines or customise your own (see Kurren123#56 (comment)). It's a table with the following:

{
[1] =function()
-- returns a string of the statusend,
cond=function()
-- returns a bool, of whether to show this status lineend
}

So eg a heirline component would look like:

locallualine_component=require("mssql").lualine_componentlocalmssql_heirline_component= {
provider=lualine_component[1],
condition=lualine_component.cond,
}

mssql.nvim calls vim.cmd("redrawstatus") whenever the status changes, so you don't need to worry about refreshing

Using a keymap that gets overridden later (eg lazyvim)

Lazyvim sets its keymaps after loading the mssql plugin. If you want to use a keymap that lazyvim already uses:

  1. Call setup() without a keymap_prefix

  2. In your keymaps.lua file, delete the lazyvim keymaps then call set_keymaps. Eg:

    -- delete lua profiler keymaps firstsafe_delete("n", "<leader>dpp")
    safe_delete("n", "<leader>dph")
    safe_delete("n", "<leader>dps")
    require("mssql").set_keymaps("<leader>d")

Usage

You can call the following as key maps typing your prefix first, as user commands by doing :MSSQL <command> or as functions on require("mssql").

Key MapUser CommandFunctionDescription
nNewQuerynew_query()Open a new buffer for sql queries
cConnectconnect()Connect the current buffer (you'll be prompted to choose a connection)
xExecuteQueryexecute_query()Execute the selection, or the whole buffer. If you are disconnected, it will try to connect to the default connection in your connections.json.
fFindfind_object()Find a table/view/stored procedure/function and generate a script
lCancelQuerycancel_query()Cancel the currently running query.
qDisconnectdisconnect()Disconnects the current buffer
sSwitchDatabaseswitch_database()Prompts, then switches to a database that is on the currently connected server
dNewDefaultQuerynew_default_query()Opens a new query and connects to the connection called default in your connections.json. Useful when combined with the promptForDatabase option in the connections.json.
sSaveQueryResultssave_query_results()When in a query result buffer, save the query result by giving a file path with an extension of .csv, .json, .xml, .xlsx or .xls
rRefreshCacherefresh_cache()Rebuild the intellisense and sql object (used for the Find function) caches
eEditConnectionsedit_connections()Open the connections file for editing
BackupDatabasebackup_database()Inserts an SQL command to back up the currently connected database
RestoreDatabaserestore_database()Prompts for a .bak file, then inserts an SQL command to restore the database from that file

Connections json file

The format is "connection name": connection object. Eg:

{
"Connection A": {
"server": "localhost",
"database": "dbA",
"authenticationType": "SqlLogin",
"user": "Admin",
"password": "Your_Password",
"trustServerCertificate": true
},
"Connection B": {
"server": "AnotherServer",
"database": "dbB",
"authenticationType": "Integrated",
"promptForDatabase": true
}
}

Each connection object takes standard connection properties. On top of those, you can also provide these useful properties:

PropertyTypeDescription
promptForDatabaseboolAfter connecting to the server, select which database to connect to.
promptForPasswordboolAsk for the password each time you connect instead of storing it in the json file

Options

Setup with options:

require("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50
})
-- With callbackrequire("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50,
}, function()
print("mssql.nvim is ready!")
end)

See here for all options and defaults

Notes

  • setup() runs asynchronously as it may take some time to first download and extract the sql tools. Pass a callback as the second argument if you need to run code after initialization.
  • Formatting options are passed into the option's lsp_settings

Supporting this project

I don't take personal donations as I feel like it ruins the fun. However, if you've already given a ⭐ and want to support this project further, please consider donating to the mssql.nvim fundraising page for Cancer Research UK.

Cancer research uk logo

Cancer affects millions of lives every year. Any research we can do into beating it also has knock-on effects on enhancing our understanding of other diseases. Seeing anyone donate will make this project worth it.

About

A Microsoft SQL Server plugin for neovim

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

workflow status badge

mssql.nvim

Logo

An SQL Server plugin for neovim. Like it? Give a ⭐️!

Features

Completions, including TSQL keywords, stored procedures and cross database queries

Tsql keywords screenshot

stored procedures screenshot

Cross db completion

Execute queries, with results in markdown tables for automatic colouring and rendering

queries

Find and generate scripts for tables, views, stored procedures and functions

find objects

User commands and which-key integration

commands

User commands screenshot

Lualine/other status line integration

Which key screenshot

🍒 Other cherries on top:

  • Save query results to csv, json, Excel and xml
  • Backup to/restore from .bak files
  • Basic TSQL formatting

Installation and setup

Requires Neovim v0.11.0 or later.

For keymaps, choose a prefix, eg <leader>m. Make sure it doesn't clash with any existing keymaps/which-key groups!

lazy.nvim
{
"Kurren123/mssql.nvim",
opts= {
-- optionalkeymap_prefix="<leader>m"
},
-- optionaldependencies= { "folke/which-key.nvim" }
}
Packer
require("packer").startup(function()
use({
"Kurren123/mssql.nvim",
-- optionalrequires= { 'folke/which-key.nvim' },
config=function()
require("mssql").setup({ keymap_prefix="<leader>m" })
end,
})
end)
Paq
require("paq")({
"savq/paq-nvim",
"Kurren123/mssql.nvim",
-- optional"folke/which-key.nvim",
})
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})
No package manager

Clone this repo, then:

-- Prepend plugin root to runtimepathvim.opt.rtp:prepend("/path/to/mssql.nvim/")
require("mssql").setup({
-- optionalkeymap_prefix="<leader>m",
})

All mssql keymaps are set up with the prefix first. In the above example, new query would be <leader>mn. If you have which-key installed, then the prefix you provide will be a which-key group.

Lualine

Insert require("mssql").lualine_component into a lualine section (eg lualine_c).

Eg lazyvim:

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts=function(_, opts)
table.insert(opts.sections.lualine_c, require("mssql").lualine_component)
returnoptsend,
}

Or Lazy.nvim (without lazyvim):

return {
"nvim-lualine/lualine.nvim",
dependencies= { "Kurren123/mssql.nvim" },
opts= {
sections= {
lualine_c= {
require('mssql').lualine_component,
},
},
},
}

Other status lines (eg heirline)

You can also use require('mssql').lualine_component in other status lines or customise your own (see Kurren123#56 (comment)). It's a table with the following:

{
[1] =function()
-- returns a string of the statusend,
cond=function()
-- returns a bool, of whether to show this status lineend
}

So eg a heirline component would look like:

locallualine_component=require("mssql").lualine_componentlocalmssql_heirline_component= {
provider=lualine_component[1],
condition=lualine_component.cond,
}

mssql.nvim calls vim.cmd("redrawstatus") whenever the status changes, so you don't need to worry about refreshing

Using a keymap that gets overridden later (eg lazyvim)

Lazyvim sets its keymaps after loading the mssql plugin. If you want to use a keymap that lazyvim already uses:

  1. Call setup() without a keymap_prefix

  2. In your keymaps.lua file, delete the lazyvim keymaps then call set_keymaps. Eg:

    -- delete lua profiler keymaps firstsafe_delete("n", "<leader>dpp")
    safe_delete("n", "<leader>dph")
    safe_delete("n", "<leader>dps")
    require("mssql").set_keymaps("<leader>d")

Usage

You can call the following as key maps typing your prefix first, as user commands by doing :MSSQL <command> or as functions on require("mssql").

Key MapUser CommandFunctionDescription
nNewQuerynew_query()Open a new buffer for sql queries
cConnectconnect()Connect the current buffer (you'll be prompted to choose a connection)
xExecuteQueryexecute_query()Execute the selection, or the whole buffer. If you are disconnected, it will try to connect to the default connection in your connections.json.
fFindfind_object()Find a table/view/stored procedure/function and generate a script
lCancelQuerycancel_query()Cancel the currently running query.
qDisconnectdisconnect()Disconnects the current buffer
sSwitchDatabaseswitch_database()Prompts, then switches to a database that is on the currently connected server
dNewDefaultQuerynew_default_query()Opens a new query and connects to the connection called default in your connections.json. Useful when combined with the promptForDatabase option in the connections.json.
sSaveQueryResultssave_query_results()When in a query result buffer, save the query result by giving a file path with an extension of .csv, .json, .xml, .xlsx or .xls
rRefreshCacherefresh_cache()Rebuild the intellisense and sql object (used for the Find function) caches
eEditConnectionsedit_connections()Open the connections file for editing
BackupDatabasebackup_database()Inserts an SQL command to back up the currently connected database
RestoreDatabaserestore_database()Prompts for a .bak file, then inserts an SQL command to restore the database from that file

Connections json file

The format is "connection name": connection object. Eg:

{
"Connection A": {
"server": "localhost",
"database": "dbA",
"authenticationType": "SqlLogin",
"user": "Admin",
"password": "Your_Password",
"trustServerCertificate": true
},
"Connection B": {
"server": "AnotherServer",
"database": "dbB",
"authenticationType": "Integrated",
"promptForDatabase": true
}
}

Each connection object takes standard connection properties. On top of those, you can also provide these useful properties:

PropertyTypeDescription
promptForDatabaseboolAfter connecting to the server, select which database to connect to.
promptForPasswordboolAsk for the password each time you connect instead of storing it in the json file

Options

Setup with options:

require("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50
})
-- With callbackrequire("mssql").setup({
keymap_prefix="<leader>m",
max_rows=50,
max_column_width=50,
}, function()
print("mssql.nvim is ready!")
end)

See here for all options and defaults

Notes

  • setup() runs asynchronously as it may take some time to first download and extract the sql tools. Pass a callback as the second argument if you need to run code after initialization.
  • Formatting options are passed into the option's lsp_settings

Supporting this project

I don't take personal donations as I feel like it ruins the fun. However, if you've already given a ⭐ and want to support this project further, please consider donating to the mssql.nvim fundraising page for Cancer Research UK.

Cancer research uk logo

Cancer affects millions of lives every year. Any research we can do into beating it also has knock-on effects on enhancing our understanding of other diseases. Seeing anyone donate will make this project worth it.

About

A Microsoft SQL Server plugin for neovim

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages