Разница между SQL-пакетом, оператором и RPC?

35

В чем разница между пакетом SQL, оператором T-SQL и удаленным вызовом процедуры?
Как я могу определить, является ли часть кода T-SQL партией или оператором?

Frogeye
источник

Ответы:

25

Ну, я полагаю, вы говорите в основном о классах Profiler, но объяснение в любом случае остается в силе.

Пакет SQL - это набор из одного или нескольких операторов, сгруппированных и разделенных оператором GO. Например: дополнительные операторы SELECT и INSERT образуют пакет, если в конце у них есть GO.

Вызов RPC - это вызов, поступающий из клиентского приложения в базу данных. Например: служба Windows, веб-приложение, приложение Windows, все, что требует подключения к базе данных, фактически вызывает RPC.

Теперь в Profiler вы увидите все, что касается сервера базы данных. Пакет из Management Studio, вызов RPC (который является либо пакетом, либо вызовом хранимой процедуры) из внешнего приложения, выполнение процедуры из Management Studio.

Каждый из них состоит из операторов TSQL, поэтому этот класс Profiler полезен на случай, если вы захотите еще больше расширить выполнение, чтобы увидеть, что на самом деле выполняется. Что вставляет, выбирает .. и т.д.

Самый простой способ просмотреть их в Profiler - это включить только вызов End RPC или End batch, и вы увидите там всю необходимую статистику (длительность, IO, CPU). Затем двигайтесь дальше, включив класс операторов TSQL, и копайте глубже.

Мэриан
источник
4
+1 Просто чтобы указать, GOявляется ли принятый и используемый по умолчанию пакетный терминатор популярных клиентов, которые мы используем (т. Е. SSMS и sqlcmd), но стоит отметить, что фактическая GOстрока в качестве пакетного терминатора может изменяться и настраиваться.
Томас Стрингер
1
Msgstr "Вызов RPC (который является либо пакетом, либо вызовом хранимой процедуры)" . Так что, в конце концов, все это RPC? Вы можете это уточнить?
Иэн Сэмюэль Маклин, старейшина
Нет, я хотел сказать, что вызов RPC формируется либо из вызова хранимой процедуры, либо из набора дополнительных операторов. То, что вы на самом деле видите в этом событии Profiler, является либо отдельной процедурой, либо пакетом дополнительных операторов.
Marian
Пожалуйста, посмотрите некоторые объяснения здесь . Некоторая другая информация здесь .
Мариан
14

Пакетная инструкция против T-SQL

Это четко определено в SQL Server BOL здесь

Пакет представляет собой группу из одного или нескольких операторов Transact-SQL, одновременно отправляемых из приложения на SQL Server для выполнения. Go - это пакетный разделитель, используемый в большинстве клиентских приложений, включая SSMS.

SQL Server компилирует операторы пакета в один исполняемый модуль, называемый планом выполнения. Операторы в плане выполнения затем выполняются по одному.

Простым термином, основанным на моем понимании, является RPC, когда вы выполняете сохраненный процесс с помощью клиентского API (например, в ADO.net CommandObject. Метод Execute)

Более подробное объяснение можно найти в одной из публикаций интернет-группы здесь :

RPC "vs" batch "- это режим выполнения TDS, который используется ADO.NET (или любым клиентом SQL Server). Когда выполняется простой оператор SQL без параметров, мы используем" batch ". Когда выполняется хранимый процесс, мы используем RPC (это не то же самое, что RPC как вызов удаленной сетевой процедуры, мы просто вызываем этот режим RPC в TDS (сетевой протокол SQL Server)). Кроме того, если вы выполняете пакет с параметром, на самом деле мы используем хранимый процесс с именем sp_executesql и передаем ему сам оператор SQL и остальные параметры, чтобы он также отображался как RPC.

Пабло Кастро,
руководитель программы - команда ADO.NET,
корпорация Майкрософт

SQL Learner
источник
Таким образом, если один оператор в пакете не выполняется, весь пакет автоматически откатывается?
MonsterMMORPG
Нет, каждый оператор в пакете фиксируется автономно, если пакет не находится внутри активной транзакции или вы не установили IMPLICIT_TRANSACTIONS ON. Пакеты и транзакции - это две разные концепции. Я знаю, что вопрос очень старый, я просто оставляю это здесь для будущих читателей.
Спагеттидба