2010-04-16 1 views
1

В принципе, у нас есть сайт ASP прямо сейчас, когда я перехожу к PHP. Мы все еще используем сервер MSSQL для БД - он не движется.Сохраненная процедура: переменная, переданная из PHP, изменяет вторую половину строки запроса

В ASP теперь есть файл include с запросом гигантского sql, который выполняется. Сюда входит сидение на многих страницах, и это простая версия того, что происходит. Страницы A, B и C используют этот файл include для возврата списка.

В ASP, страница А проходит через переменную A в файл include - страница B проходит через переменную B - страница C проходит через переменную C и т. Д.

инклюдник строит SQL запрос следующим образом:

sql = "SELECT * from table_one LEFT OUTER JOIN table_two ON table_one.id = table_two.id"

добавляет (помните, ASP), на основе переменного, переданных через от родительской страницы,

Select Case sType 
Case "A" 
sql = sql & "WHERE LOWER(column_a) <> 'no' AND LTRIM(ISNULL(column_b),'') <> '' ORDER BY column_a 
Case "B" 
sql = sql & "WHERE LOWER(column_c) <> 'no' ORDER BY lastname, firstname 
Case "C" 
sql = sql & "WHERE LOWER(column_f) <> 'no' OR LOWER(column_g) <> 'no' ORDER BY column_g 

As вы заметите, что каждая строка, добавленная в качестве второй части запроса sql, отличается от предыдущей; не может быть заменена не одна переменная, и это то, что меня озадачило.

Как перевести этот регистр/переключатель в хранимую процедуру на основе ввода varchar, который я передаю в хранимую процедуру через PHP?

Эта хранимая процедура будет обрабатывать список запросов примерно на 20 страницах, так что он здоровенный, и это мой первый сложный сложный вопрос. Хотя я добираюсь туда! Я тоже больше привык к MySQL. Не то чтобы они разные. : P

Благодарим вас за помощь.

Стефани

ответ

1

Как перевести этот случай/переключения в хранимую процедуру, на основе ввода VARCHAR, что я прохожу к хранимой процедуре с помощью PHP?

В SQL Server, то CASE expression является не для контроля-оф-потока, как IF/ELSE.

Использование:

DECLARE @SQL NVARCHAR(max) 
    SET @SQL = N'SELECT ...' 

    SET @SQL = @SQL + CASE sType 
         WHEN 'A' THEN ' WHERE ... ' 
         WHEN 'B' THEN ' WHERE ... ' 
         WHEN 'C' THEN ' WHERE ... ' 
         ELSE ' ' 
         END 
BEGIN 

    EXEC sp_executesql @SQL 

END 

Чтобы мы не забыли о ominous tale of Little Bobby Tables, лучше читать The curse and blessings of Dynamic SQL.

+0

ха-ха. Эта динамическая SQL-страница очень длинная, но я буду читать, что смогу. Я определенно знаю опасности инъекций, поэтому я ценю это. Кроме того, вы полностью выигрываете не только для распечатанного кода, но и для комикса XKCD. Спасибо. –

1

Вам нужно сделать динамический SQL в хранимой процедуре. Эта ссылка поможет вам: http://www.sommarskog.se/dynamic_sql.html

+0

Как ни странно, я только что нашел эту страницу, прежде чем вы разместили ее. Спасибо огромное! –

 Смежные вопросы

  • Нет связанных вопросов^_^