2015-01-22 2 views
1

Я пытаюсь написать SQL-скрипт с идиотским доказательством, который может выполняться неграмотными пользователями без SQL.Выполнять SQL-запрос только в том случае, если выполнено условие

Моя идея состоит в том, чтобы иметь пару переменных, определенных в верхней части скрипта, а затем запускать определенные запросы на основе этих переменных.

Я тестирую на mySQL, но в конечном итоге это будет работать на SQL-сервере.

В псевдокоде это то, что я пытаюсь сделать:

# Set matchThis to the value to match 
SET @matchThis = "matchMe"; 

# Uncomment (remove the #) one of the two lines below to update or just view 
#SET @update = "YES"; 
SET @update = "NO"; 

IF @update = "YES" { 
    UPDATE myTable SET myColumn = "changed" WHERE matchVal = @matchThis; 
} ELSE { 
    SELECT * FROM myTable WHERE matchVal = @matchThis; 
} 

Я хочу сделать это полностью в SQL, если есть способ.

Я видел руководства по использованию SELECT IF и т. Д., Но не могу понять, как достичь вышеуказанного.

+5

Вы хотите предоставить пользователю, не являющемуся языком SQL, доступ к вашему серверу для выполнения SQL-скриптов? Это звучит опасно, если не сказать больше. – WeSt

+0

Поместите любой sql, который вы хотите в процедуру, и запустите это. – Mihai

+0

@WeSt Это сделано в настоящий момент, когда люди фактически вручную редактируют таблицы. Когда я говорю не-SQL-грамотный, у них есть некоторые (разные уровни) способности, но сценарии кажутся очевидным способом сделать вещи более безопасными, гарантируя, что только правые таблицы будут изменены ... –

ответ

1

Это для MSSQL. Я думаю, что вы все потеряли, но синтаксис. Надеюсь, это помогает/работает.

DECLARE @matchthis AS VARCHAR(MAX) 
DECLARE @update AS VARCHAR(1) 

SET @matchthis = 'matchme' 
[email protected] can be Y or N. User changes this here. 
SET @update = 'Y' 

IF @update = 'Y' 
    UPDATE mytable SET myColumn = 'changed' WHERE matchval = @matchthis 
ELSE IF @update = 'N' 
    SELECT * FROM myTable WHERE matchval = @matchthis 

я не знаю, делать ли измененная переменную, но если вы хотите сделать это переменная, тот же синтаксис, как и для @matchthis (объявлять и установить).

Если вы хотите сделать это действительно доказательством идиота, я бы сказал, что лучше всего сделать хранимую процедуру, чтобы пользователи не видели код, у них просто есть окно ввода.

0

Здесь есть два вопроса. Одна из причин, почему оператор IF не работает, потому что T-SQL не имеет брекетов. Синтаксис показан в the documentation.

Важным вопросом является то, как передать параметры сценарию без изменения пользователем самого скрипта. Это делается с использованием Script Variables. Когда скрипт выполняется с помощью команды sqlcmd, любой текст формы $(SomeName) заменяется параметрами командной строки или переменными среды с тем же именем.

Например, если у вас есть следующий скрипт

USE AdventureWorks2012; 
SELECT x.$(ColumnName) 
FROM Person.Person x 
WHERE c.BusinessEntityID < 5; 

Эта команда будет работать его с FirstName в качестве имени столбца

sqlcmd -v ColumnName ="FirstName" -i c:\testscript.sql 
+0

Я понимаю, что синтаксис IF полностью неверен в моем исходном сообщении. Вот почему я называю это псевдокодом. Я надеюсь, что Гордон Линофф теперь меня на правильном пути, хотя ... –

0

Вы довольно оптимистично, если вы хотите, чтобы получить сценарий, будет работать так же в MySQL и SQL Server. Тем не менее, для базового сценария, вы можете сделать это:

-- Set matchThis to the value to match 
SET @matchThis = 'matchMe'; 

-- Uncomment (remove the #) one of the two lines below to update or just view 
-- SET @update = 'YES'; 
SET @update = 'NO'; 

UPDATE myTable 
    SET myColumn = 'changed' 
    WHERE matchVal = @matchThis AND @update = 'YES'; 

SELECT * 
FROM myTable 
WHERE matchVal = @matchThis AND @update <> 'YES'; 

Это немного отличается от вашего сценария. Это фактически запускает select, если @update - 'YES', но он не вернет никаких строк.

Две ноты:

  • SQL Server не использует двойные кавычки для строковых констант.
  • MySQL не разрешает if операторов, за исключением хранимых программ.
  • Стандартный механизм для комментирования линии два дефиса (--)

Если вам нужен сценарий для запуска в T-SQL, вы должны разработать его с помощью T-SQL.

+0

Это самое близкое к тому, чего я пытаюсь достичь. Однако, когда я добавляю «AND @update ...» в предложение where, я не получаю возвращенных строк ... –

+0

@FatMonk Каково значение 'update'? Если это значение равно null, то проверка завершается неудачно, так как любое сравнение с null не выполняется. Также обратите внимание, что такой синтаксис подходит только для скриптов. SQL Server кэширует план выполнения команды/хранимой процедуры при первом использовании. Если последующий вызов вызывает принципиально иное поведение, план выполнения кэширования может оказаться неприемлемым и приведет к неэффективным запросам –

+0

@FatMonk. , , Баммер, я пропустил это. Вы также не можете использовать переменные. SQL Server требует 'declare'. MySQL только позволяет «объявлять» в программных блоках. Никс эту идею. Сделайте разработку на SQL Server. –