Show/Hide Toolbars

Руководство администратора

Унификация TSQL — PGSQL в смартах

Ссылки Назад Вверх Вперед

MS SQL (TSQL)

PostgreSQL (PGSQL)

Что делать. Есть ли универсальный вариант для работы в любом SQL

Сложность замены

Частота использования

Идентификаторы, транзакции и пр.

При обращениях к объектам можно использовать квадратные скобки (они обязательны, только если в названии объекта или его поля присутствуют недопустимые символы):  [table].[field]

 

Название объекта, заключенное в [] даст ошибку синтаксиса, нужно либо удалить скобки, либо использовать двойные кавычки (если в названии объекта присутствуют недопустимые символы): "table"."field"

 

Удалить []. Не использовать экранирование идентификаторов с помощью [] без необходимости. Использовать общий способ именования объектов, чтобы [] или «» не требовались.

 

Легко, но трудоемко

Постоянно

WITH (NOLOCK) или (NOLOCK), а также его аналог SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

 

Аналога нет

Удалить

Лего

Постоянно

Типы данных

Использование строк ограниченной переменной длины, типа: varchar(max), nvarchar(n)

 

varchar(n)

Указать значение вместо "max" для varchar(max);

Исправить nvarchar на  varchar (скорее всего, есть другой способ).

Использовать общий тип varchar(n)

 

Зависит от контекста

Средне

Работа с переменными

DECLARE @myvar INT SET @myvar = 5

SELECT * FROM somewhere WHERE something = @myvar

Самый простой из рекомендуемых способов — использовать CTE:

WITH vars AS (SELECT 5 AS myvar) SELECT * FROM somewhere,vars WHERE something = vars.myvar;

 

Пример для одной переменной:

WITH decl AS (SELECT '5' AS my_var)

SELECT my_var from decl

 

Пример для нескольких переменных:

WITH my_var (var1, var2) as (

  values (5, 'foo')

)

SELECT *

FROM table1, my_var

/* т.е. используется CROSS JOIN */

WHERE something_from_table1 = var1

  OR something_else = var2;

Сложно

Часто

Операторы, условия, циклы

SELECT TOP N ...

SELECT .... LIMIT N

TOP удалить,  LIMIT добавить.

Использовать общий LIMIT.

Леко

Редко

ISNULL()

COALESCE()

Заменить ISNULL на COALESCE.

Использовать общий COALESCE.

Леко

Средне

IIF()

CASE WHEN...THEN

Заменить.

Использовать общий CASE.

Cредне

Редко

WHILE … BEGIN … END

WHILE … LOOP… END LOOP

Добавить операторы LOOP, ограничивающие "тело цикла"

Леко

Редко

IF логическое-выражение BEGIN операторы

END

IF логическое-выражение

THEN   операторы

END IF

При использовании более сложной конструкции вида:

IF-BEGIN-END-ELSE-BEGIN-END

в PG SQL может использоваться конструкция вида:

if-then-elseif-then-else-end if;

Cредне

Cредне

Функции работы со строками

Конкатенация строк:

+ или CONCAT()

|| или CONCAT

Использовать общий CONCAT

Легко, но трудоемко

Постоянно

Определение длины строки:

LEN()

LENGTH()

Заменить

Леко

Редко

Определение расположения последовательности в строке:

CHARINDEX()

STRPOS()

Заменить

Леко

Редко

Вставка одной строки в другую с заданной позиции:

STUFF или STRING_AGG

STRING_AGG

Использовать общий STRING_AGG

Cредне

Редко

Дата, время, форматирование

Получение текущей даты и времени (локальное время):

GetDate()

CURRENT_TIMESTAMP

Заменить.

Использовать общий CURRENT_TIMESTAMP

Легко

Средне

Приращение даты-времени:

DATEADD

Пример:

select DATEADD(day,1,getdate())

функции:

interval  или make_interval()

Пример:

select CURRENT_TIMESTAMP + interval '1 day';

select CURRENT_TIMESTAMP + make_interval(days => 1);

Переписать конструкцию.

Средне

Средне