SQL Server
Prisma ORM supports Microsoft SQL Server (2017+) databases.
Configure the SQL Server provider in your Prisma schema:
datasource db {
provider = "sqlserver"
}Set the connection URL in prisma.config.ts:
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema.prisma",
datasource: {
url: env("DATABASE_URL"), // sqlserver://host:1433;database=db;...
},
});Use the node-mssql JavaScript database driver via driver adapters:
bun add @prisma/adapter-mssqlpnpm add @prisma/adapter-mssqlyarn add @prisma/adapter-mssqlnpm install @prisma/adapter-mssqlimport { PrismaMssql } from "@prisma/adapter-mssql";
import { PrismaClient } from "./generated/prisma";
const config = {
server: "localhost",
port: 1433,
database: "mydb",
user: "sa",
password: "mypassword",
options: {
encrypt: true,
trustServerCertificate: true, // For self-signed certificates
},
};
const adapter = new PrismaMssql(config);
const prisma = new PrismaClient({ adapter });import { PrismaMssql } from "@prisma/adapter-mssql";
import { PrismaClient } from "./generated/prisma";
const config = {
server: "localhost",
port: 1433,
database: "mydb",
user: "sa",
password: "mypassword",
options: {
encrypt: true,
trustServerCertificate: true, // For self-signed certificates
},
};
const adapter = new PrismaMssql(config);
const prisma = new PrismaClient({ adapter });SQL Server uses JDBC-style connection strings:
sqlserver://HOST[:PORT];database=DATABASE;user=USER;password=PASSWORD;encrypt=trueEscaping special characters:
If your credentials contain : \ = ; / [ ] { }, wrap values in curly braces:
sqlserver://host:1433;user={MyServer/User};password={Pass:Word;};database=db| Argument | Default | Description |
|---|---|---|
database / initial catalog |
master |
Database name |
user / username / uid |
SQL Server login or Windows username (if using integratedSecurity) |
|
password / pwd |
Password for user | |
encrypt |
true |
Use TLS: true (always), false (login only) |
integratedSecurity |
Windows authentication: true, false, yes, no |
|
schema |
dbo |
Schema prefix for all queries |
connectTimeout |
5 |
Seconds to wait for connection |
socketTimeout |
Seconds to wait for each query | |
poolTimeout |
10 |
Seconds to wait for connection from pool |
trustServerCertificate |
false |
Trust server certificate without validation |
trustServerCertificateCA |
Path to CA certificate file (.pem, .crt, .der) |
|
ApplicationName |
Application name for the connection |
Using current Windows user:
sqlserver://localhost:1433;database=sample;integratedSecurity=true;trustServerCertificate=true;Using specific Active Directory user:
sqlserver://localhost:1433;database=sample;integratedSecurity=true;username=prisma;password=aBcD1234;trustServerCertificate=true;Named instance:
sqlserver://mycomputer\sql2019;database=sample;integratedSecurity=true;trustServerCertificate=true;| Prisma | SQL Server |
|---|---|
String |
NVARCHAR(1000) |
Boolean |
BIT |
Int |
INT |
BigInt |
BIGINT |
Float |
FLOAT(53) |
Decimal |
DECIMAL(32,16) |
DateTime |
DATETIME2 |
Json |
Not supported |
Bytes |
VARBINARY(MAX) |
See full type mapping reference for complete details.
UNIQUE constraints:
SQL Server allows only one NULL value per UNIQUE constraint. Use filtered indexes to work around this, but note they cannot be used as foreign keys.
Cyclic references:
With circular model references, you must use NoAction referential actions to avoid validation errors.
Raw queries with VARCHAR columns:
String parameters in raw queries are encoded as NVARCHAR(4000) or NVARCHAR(MAX). When querying VARCHAR(N) columns, manually cast to avoid index performance issues:
// ❌ Causes implicit conversion
await prisma.$queryRaw`SELECT * FROM user WHERE name = ${"John"}`;
// ✅ Enables index seek
await prisma.$queryRaw`SELECT * FROM user WHERE name = CAST(${"John"} AS VARCHAR(40))`;Schema names:
SQL Server doesn't have SET search_path. Ensure your connection URL schema parameter matches production (typically dbo):
sqlserver://host:1433;database=db;schema=dbo;...Destructive changes:
Some operations require table recreation:
- Adding/removing
autoincrement() - Dropping all columns from a table
Shared default values:
Prisma doesn't support SQL Server's sp_bindefault. Use per-column defaults instead.
Windows:
- Install SQL Server 2019 Developer
- Install SQL Server Management Studio
- Enable TCP/IP in SQL Server Configuration Manager → Protocols for MSSQLSERVER
- (Optional) Enable SQL authentication: Properties → Security → SQL Server and Windows Authentication Mode
Docker:
docker pull mcr.microsoft.com/mssql/server:2019-latest
docker run --name sql_container \
-e 'ACCEPT_EULA=Y' \
-e 'SA_PASSWORD=myPassword' \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2019-latestConnect with: Username sa, password myPassword, port 1433