Member 11810984 Ответов: 2

Я хочу написать оператор вызова в SQL server


Получение какой-то ошибки
Вот мой mysql код который я хочу написать на sql сервере

CREATE DEFINER=`root`@`localhost` процедура `sp_CallStatement`
(
В vStmt VARCHAR(1000)
)
НАЧАТЬ
SET @sql=vStmt;
Подготовьте s1 из @sql;
Выполнение С1;
Освободить место подготовить s1;
КОНЕЦ$$

ОГРАНИЧИТЕЛЬ ;


//ошибка/
Msg 137, Уровень 15, состояние 1, процедура sp_CallStatement, строка 8
Необходимо объявить скалярную переменную "@sql".
Msg 102, Уровень 15, состояние 1, процедура sp_CallStatement, строка 11
Неправильный синтаксис возле 'готовить'.

Что я уже пробовал:

Создайте процедуру [dbo].[sp_CallStatement]
@Stmt VARCHAR(1000)
как
НАЧАТЬ
SET @sql=vStmt;
Подготовьте s1 из @sql;
Выполнение С1;
Освободить место подготовить s1;
КОНЕЦ

RedDk

Используя MSSQL, где-то в строках выше будет объявлен @sql. Что касается "mysql" ... а это что такое?

2 Ответов

Рейтинг:
14

OriginalGriff

Msg 137, Level 15, State 1, Procedure sp_CallStatement, Line 8
Must declare the scalar variable "@sql".
Как говорится в сообщении об ошибке: вы не объявляете @sql поэтому он не знает, что с ним делать.

Msg 102, Level 15, State 1, Procedure sp_CallStatement, Line 11
Incorrect syntax near 'PREPARE'.
PREPARE-это не ключевое слово SQL: оно не знает, что вы имеете в виду: Зарезервированные ключевые слова (Transact-SQL) | Microsoft Docs[^]
Prepare-это PHP-конструкция, а не SQL. Что оставляет ваш SP широко открытым для SQL-инъекций снова и снова...


Рейтинг:
0

Member 14207397

--Этот работает.

CREATE PROCEDURE [dbo].[sp_CallStatement]
@Stmt nvarchar(max)
as
BEGIN
SET NOCOUNT ON;
Declare @sql nvarchar(max)
SET @sql=@Stmt
EXECUTE @Stmt;
END
GO


Nirav Prabtani

+5

CHill60

Какой смысл вообще иметь @sql в этом SP? Он никогда не используется

Member 14207397

-- Синтаксис для SQL Server(так взял @sql)
-- Объявите переменную, которая будет использоваться.
Объявить @MyCounter int;

-- Инициализируйте переменную.
SET @MyCounter = 0;--(установите их значения)
локальная переменная с именем @sql для получения значения

Richard Deeming

Как указано в решении 1, это оставляет вашу базу данных широко открытой для SQL-инъекций.

Хранимые процедуры сами по себе не защитят вас!

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
PHP: SQL-инъекция - руководство пользователя[^]