SQL Server: Как изменить параметры сортировки всех столбцов моего выбора на лету - PullRequest
0 голосов
/ 11 декабря 2018

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

Я нашел, как изменить параметры сортировки одного столбца на лету так:

SELECT 
  u.name  COLLATE Latin1_General_CI_AS AS 'User'(...)

Но проблема в том, что более 150 столбцов нуждаются в изменении COLLATION на лету (не спрашивайте меня, почему, потому что мы не можем изменить параметры сортировки всей таблицы, хотя я думаю,это был бы лучший вариант).

Итак, главный вопрос: Is there a way to set the COLLATION to all columns of my query?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Нет способа изменить параметры сортировки всех текстовых столбцов на лету, но выполнимо манипулирование запросом для достижения того же результата. Ответ Мартина показывает один способ сделать это, вот другой, использующий метаданные запроса.В качестве преимущества, он не требует курсора и избегает произвольного ввода «новых» столбцов, если сортировка уже соответствует желаемому.Для него требуется как минимум SQL Server 2012 с sys.dm_exec_describe_first_result_set и SQL Server 2017 с STRING_AGG (в предыдущих версиях можно было использовать классические приемы для конкатенации строк, например FOR XML PATH).

DECLARE @query NVARCHAR(MAX) = N'SELECT * FROM MyTable';
DECLARE @tweakedQuery NVARCHAR(MAX);
DECLARE @tweakedCollation SYSNAME = N'Latin1_General_CI_AS';

SELECT @tweakedQuery = CONCAT(
    'SELECT ', 
    STRING_AGG(
        CONCAT(
            CONVERT(NVARCHAR(MAX), QUOTENAME([name])), 
            CASE 
                WHEN collation_name IS NOT NULL AND collation_name <> @tweakedCollation
                THEN ' COLLATE ' + @tweakedCollation + ' AS ' + QUOTENAME([name]) 
            END
        ), 
        ', ' + CHAR(13) + CHAR(10)
    ),
    ' FROM (' + CHAR(13) + CHAR(10),
    @query,
    CHAR(13) + CHAR(10) + ') _'
)
FROM sys.dm_exec_describe_first_result_set(@query, NULL, NULL);
PRINT @tweakedQuery;

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

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

0 голосов
/ 11 декабря 2018

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

Однако, если ваш сервер разрешает вам использовать динамический SQL, вы могли бы создать динамическийзапросить и выполнить его, чтобы получить результат, который вы ищете.

Пример этой работы показан ниже.Измените YOUR_TABLE_NAME на фактическое имя таблицы, чтобы оно работало:

DECLARE @col    VARCHAR(200)
DECLARE @sql    VARCHAR(MAX)
DECLARE @table  VARCHAR(200)
SET @table = 'YOUR_TABLE_NAME';

-- Use a cursor to read all varchar columns from table
DECLARE curColumns CURSOR FORWARD_ONLY STATIC READ_ONLY
  FOR
    SELECT  c.name
      FROM  sys.columns c
        INNER JOIN sys.types t ON c.user_type_id = t.user_type_id
      WHERE c.object_id = OBJECT_ID(@table) AND
            t.name = 'varchar'

SET @sql = 'SELECT'

-- Go through column cursor
OPEN curColumns
FETCH NEXT FROM curColumns INTO @col
WHILE (@@FETCH_STATUS = 0)
BEGIN
    -- Add column to SQL with collation
    SET @sql = @sql + ' ' + @col + ' COLLATE Latin1_General_CI_AS,'

    FETCH NEXT FROM curColumns INTO @col
END
CLOSE curColumns
DEALLOCATE curColumns

-- Add the from clause
SET @sql = SUBSTRING(@sql, 0, LEN(@sql) - 1) + ' FROM ' + @table

-- Uncomment this line to see the generated SQL
--PRINT @sql
EXEC (@sql)

Обратите внимание, что в приведенном выше примере есть несколько ограничений:

  1. Ваш сервер должен разрешитьвыполнение динамического SQL.
  2. В этом примере выводятся только столбцы VARCHAR (вы можете изменить это, изменив запрос курсора, чтобы включить больше типов).
  3. Нет способаукажите псевдонимы столбцов, используя этот метод.
...