Дано:Разница в производительности, требующие sp_executesql с динамическим SQL против параметров
CREATE PROCEDURE [dbo].[my_storedproc]
@param1 int, @param2 varchar(100)
AS
<<whatever>>
GO
Существуют известные различия в производительности между этими различными методами выполнения ?:
-- Method #1:
declare @param1 int = 1
declare @param2 varchar(100) = 'hello'
exec my_storedproc @param1, @param2
-- Method #2:
exec my_storedproc @param1=1, @param2='hello'
-- Method #3:
declare @param1 int = 1
declare @param2 varchar(100) = 'hello'
declare @procname nvarchar(100) = N'my_storedproc @param1, @param2'
declare @params nvarchar(4000) = N'@param1 int, @param2 varchar(100)'
exec sp_executesql @procname, @params, @param1, @param2
-- Method #4:
declare @procname nvarchar(4000) = N'my_storedproc @param1=1, @param2=''hello'''
exec sp_executesql @procname
-- Method #5:
declare @procname nvarchar(4000) = N'my_storedproc 1, ''hello'''
exec sp_executesql @procname
-- Method #6:
declare @procname nvarchar(4000) = N'my_storedproc 1, ''hello'''
exec (@procname)
«Почему ты спрашиваешь?» ты спрашиваешь? Я пытаюсь найти способ для общего выполнения хранимых процедур, полностью основанных на метаданных, управляющая хранимая процедура, которая будет физически выполнять все остальные настроенные (в метаданных) хранимые процедуры ничего не знает о них, кроме того, что определено в метаданных. Внутри этого контроллера SP я не могу (в каком-либо практическом смысле) знать и объявлять конкретные физические параметры (с их требуемыми типами данных), необходимые для всех возможных хранимых процедур, которые могут быть вызваны - я пытаюсь найти способ их выполнения в целом, но, надеюсь, поддерживать достойную производительность (повторное использование планов запросов и т. д.).
Я не знаю, почему так много людей думают, что это хорошая идея. То, что вы описываете, - это одна хранимая процедура, которая может выполнять любую другую хранимую процедуру. Это похоже на создание единого метода в .NET, который может что-то сделать. Конечно, это можно сделать, но стоимость будет производительностью. Каждый раз, когда вам нужно что-либо делать с хранимой процедурой, сначала нужно разобрать кучу вещей, чтобы понять, что на самом деле делать. –
Интересно, как люди SQL буквально не могут понять основополагающий принцип здесь - не только это не сумасшествие, это тот самый принцип, на котором основаны инструменты ORM. «Это похоже на создание единого метода в .NET, который может делать что угодно» Нет, это не так, у вас все еще есть отдельные хранимые процедуры. «стоимость будет производительностью». Это? Вот в чем вопрос. Это то, что хулители говорили о динамическом SQL с ORM, и они оказались неверными. – tbone
Правильно, но ORM генерирует sql динамически. И я еще не видел ORM, который производит отличный sql. Это невероятно сложно, поэтому sql всегда настолько неуправляем. Я думаю, что sql, выходящий из чего-то с этим дополнительным слоем абстракции, будет еще более сумасшедшим. Я был бы очень осторожен в использовании методов 3 или 4, которые вы описали, потому что было бы трудно предотвратить внедрение sql без использования параметров. И метод 1 не будет достаточно общим для того, что вы пытаетесь сделать. –