UNPKG

@bilims/mcp-sqlserver

Version:

MCP Server for Microsoft SQL Server with CRUD operations and data analysis capabilities

134 lines 6.24 kB
export class QueryBuilder { static buildSelectQuery(params) { const { table, columns = ['*'], where = [], joins = [], orderBy = [], limit, offset } = params; let query = `SELECT ${columns.join(', ')} FROM [${table}]`; const inputs = {}; let paramCounter = 1; if (joins.length > 0) { for (const join of joins) { query += ` ${join.type} JOIN [${join.table}] ON ${join.on}`; } } if (where.length > 0) { const conditions = []; for (const condition of where) { const paramName = `param${paramCounter++}`; switch (condition.operator) { case 'IS NULL': conditions.push(`[${condition.column}] IS NULL`); break; case 'IS NOT NULL': conditions.push(`[${condition.column}] IS NOT NULL`); break; case 'IN': case 'NOT IN': if (Array.isArray(condition.value)) { const inParams = condition.value.map((_, index) => { const inParamName = `${paramName}_${index}`; inputs[inParamName] = condition.value[index]; return `@${inParamName}`; }).join(', '); conditions.push(`[${condition.column}] ${condition.operator} (${inParams})`); } break; default: conditions.push(`[${condition.column}] ${condition.operator} @${paramName}`); inputs[paramName] = condition.value; } } query += ` WHERE ${conditions.join(' AND ')}`; } if (orderBy.length > 0) { const orderClauses = orderBy.map(order => `[${order.column}] ${order.direction}`); query += ` ORDER BY ${orderClauses.join(', ')}`; } if (limit) { if (offset) { query += ` OFFSET ${offset} ROWS FETCH NEXT ${limit} ROWS ONLY`; } else { query = `SELECT TOP ${limit} ${columns.join(', ')} FROM [${table}]` + query.substring(query.indexOf(' FROM') + 6); } } return { query, inputs }; } static buildInsertQuery(table, data) { const columns = Object.keys(data); const values = columns.map(col => `@${col}`); const query = `INSERT INTO [${table}] ([${columns.join('], [')}]) VALUES (${values.join(', ')})`; return { query, inputs: data }; } static buildUpdateQuery(table, data, where) { const setColumns = Object.keys(data); const setClauses = setColumns.map(col => `[${col}] = @${col}`); let query = `UPDATE [${table}] SET ${setClauses.join(', ')}`; const inputs = { ...data }; if (where.length > 0) { const conditions = []; let paramCounter = 1000; // Start high to avoid conflicts with data params for (const condition of where) { const paramName = `where_param${paramCounter++}`; switch (condition.operator) { case 'IS NULL': conditions.push(`[${condition.column}] IS NULL`); break; case 'IS NOT NULL': conditions.push(`[${condition.column}] IS NOT NULL`); break; case 'IN': case 'NOT IN': if (Array.isArray(condition.value)) { const inParams = condition.value.map((_, index) => { const inParamName = `${paramName}_${index}`; inputs[inParamName] = condition.value[index]; return `@${inParamName}`; }).join(', '); conditions.push(`[${condition.column}] ${condition.operator} (${inParams})`); } break; default: conditions.push(`[${condition.column}] ${condition.operator} @${paramName}`); inputs[paramName] = condition.value; } } query += ` WHERE ${conditions.join(' AND ')}`; } return { query, inputs }; } static buildDeleteQuery(table, where) { let query = `DELETE FROM [${table}]`; const inputs = {}; if (where.length > 0) { const conditions = []; let paramCounter = 1; for (const condition of where) { const paramName = `param${paramCounter++}`; switch (condition.operator) { case 'IS NULL': conditions.push(`[${condition.column}] IS NULL`); break; case 'IS NOT NULL': conditions.push(`[${condition.column}] IS NOT NULL`); break; case 'IN': case 'NOT IN': if (Array.isArray(condition.value)) { const inParams = condition.value.map((_, index) => { const inParamName = `${paramName}_${index}`; inputs[inParamName] = condition.value[index]; return `@${inParamName}`; }).join(', '); conditions.push(`[${condition.column}] ${condition.operator} (${inParams})`); } break; default: conditions.push(`[${condition.column}] ${condition.operator} @${paramName}`); inputs[paramName] = condition.value; } } query += ` WHERE ${conditions.join(' AND ')}`; } return { query, inputs }; } } //# sourceMappingURL=query-builder.js.map