Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: 1 2 [все] |
Nevillested Member Откуда: Москва Сообщений: 31 |
Добрый вечер, товарищи. Оговорюсь сразу, сделал уже 2 похожих батника, примерно понимаю что есть что. С третьим батником-беда. Бьюсь как об стенку горох. К сути, есть батник, он должен сделать селект и выгрузить всё в файл. (на самом деле он еще много что должен сделать, как и предыдущие два, но на третьем я встал в самом начале.) sqlcmd -S адрес_сервера -d моя_БД -E -s',' -W -Q "declare @a DATE set @a=cast(getdate() as date); select top (1) (подзапрос 1) as pod1, ((подзапрос 2)-(подзапрос 1)) as dif_pod, (подзапрос_2) as pod2, statistiks from table"> file.txt Нет, у меня весь код находится в одной сплошной строке, без перехода на новую строку, тут я написал так-для читабельности и наглядности. Проблема-батник отрабатывает, все ок, но результат у меня получается в виде pod1'dif_pod'pod2'statistiks ---------'------------------'---------'------------- NULL'NULL'NULL'NICE! (1 rows affected) Если я этот же запрос выполню на клиенте mssql-все окей, даёт нормальные данные, а не NULL. NULL'ы эти-данные типа datetime. При чем, сделал уже 2 максимально похожих батника, но по другой таблице этой же БД, и другой таблице другой БД-все супер, а здесь почему-то НУЛЫ. Это может помочь в решении-если из подзапросов1/2 убрать WHERE, не дает нулы, но дело в том, что where мне там нужно) Есть мысли? Заранее благодарен _____ версия 2014 standart Сообщение было отредактировано: 10 фев 21, 16:48 |
10 фев 21, 16:52 [22278994] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 3971 |
"Это может помочь в решении-если из подзапросов1/2 убрать WHERE, не дает нулы, но дело в том, что where мне там нужно) Есть мысли?" А где же там вхере? |
10 фев 21, 17:04 [22279005] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
Nevillested, От collation, до ansi nulls - показывайте подробнее |
10 фев 21, 17:19 [22279014] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8322 |
Nevillested, напишите set ansi_nulls on; declare @a ... и попробуйте set ansi_nulls off; declare @a ... Сообщение было отредактировано: 10 фев 21, 17:42 |
10 фев 21, 17:48 [22279030] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
Что показывать? Не совсем Вас понял
не сработало
Я его уместил в "подзапрос". Ниже все так как есть, только там еще идет union all, но я его убрал, как и второй запрос, который шел под унионом. (все равно даёт нулы, даже без "унион+второй запрос") declare @a DATE set @a=cast(getdate() as date); SELECT top (1) (select min(time_run) FROM [table] where cast(time_run as date)=@a) as min_run, (convert(varchar,(cast(((select max(time_end) FROM [table] where cast(time_run as date)=@a) - (select min(time_run) FROM [table] where cast(time_run as date)=@a)) as time)), 20)) as work, (select max(time_end) FROM [table] where cast(time_run as date)=@a) as max_run, statik FROM [table] Результат: min_run'work'max_run'statik ---------'------------------'---------'---------- NULL'NULL'NULL'NICE! (1 rows affected) Сообщение было отредактировано: 11 фев 21, 10:06 |
||||||||||||
11 фев 21, 10:09 [22279319] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9634 |
Nevillested, А time_run какого типа? varchar(n)? |
11 фев 21, 10:25 [22279334] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
invm, datetime все, кроме statik |
11 фев 21, 11:05 [22279366] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9634 |
|
||||
11 фев 21, 11:17 [22279377] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
Полный запрос. И уточнить типы данных по каждому полю, к которому применяются фильтры или по которому возможна сортировка результата. Код в 22279319 соответствует действительности или есть какие-то опущенные фильтры? |
||||
11 фев 21, 11:17 [22279378] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
Проверил БД, проверил сервер, всё то, что надо, даже коллегу попросил посмотреть, не долблюсь ли я в глаза. Кажется, оба долбимся.
Вот прямо-таки полный со всеми фильтрами declare @a DATE set @a=cast(getdate() as date); SELECT top (1) (select min(time_run) FROM [table] where cast(time_run as date)=@a and name like '%olga%' and name not like '%ivanova%') as min_run, (convert(varchar,(cast(((select max(time_end) FROM [table] where cast(time_run as date)=@a and name like '%olga%' and name not like '%ivanova%') - (select min(time_run) FROM [table] where cast(time_run as date)=@a and name like '%olga%' and name not like '%ivanova%')) as time)), 20)) as work, (select max(time_end) FROM [table] where cast(time_run as date)=@a and name like '%olga%' and name not like '%ivanova%') as max_run, statik FROM [table] name-nvarchar time_run-datetime time_end-datetime |
||||||||||||||||
11 фев 21, 11:37 [22279392] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
упд. Возможно ещё явно стоит указать, COLLATE для литералов, чтобы был явный _CI Сообщение было отредактировано: 11 фев 21, 11:34 |
||||
11 фев 21, 11:38 [22279393] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
что за N? В моем коде такого нет Не совсем Вас понял, что значит указать COLLATE для литералов, чтобы был явный _CI? |
||||||||
11 фев 21, 11:49 [22279409] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
Добавьте и запустите. |
||||
11 фев 21, 11:55 [22279414] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
Ровно то, что написано - добавить после литерала инструкцию COLLATE с совпадающими для ваших nvarchar полей значениями кодовой страницы и параметров сортировки и явным указанием Case Insensitive, если нет уверенности, что значения в таблице также как и в литерале строго в нижнем регистре. |
||||
11 фев 21, 11:58 [22279419] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
Не сработало
Не понимаю того, что Вы говорите, просто потому что не знаю, что вообще это такое. Сейчас погуглю, разберусь и дам знать о результатах позже |
||||||||||||||||
11 фев 21, 12:13 [22279426] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
Nevillested,create table #tmp (s nvarchar(10) collate cyrillic_general_cs_as); insert into #tmp(s) values (N'Abc'), (N'abc'); select * from #tmp where s like N'%ab%'; S --- abc select * from #tmp where s like N'%ab%' collate cyrillic_general_ci_as; S --- Abc abc |
11 фев 21, 12:28 [22279439] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9634 |
Nevillested, Клиент и sqlcmd работают под одним и тем же логином? |
11 фев 21, 12:29 [22279441] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
invm, да, под одним и тем же логином |
||||
11 фев 21, 14:57 [22279522] Ответить | Цитировать Сообщить модератору |
Ennor Tiegael Member Откуда: Сообщений: 3348 |
|
||||||||
11 фев 21, 15:45 [22279554] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9634 |
Добавьте к вызову sqlcmd ключ -I А вообще, лучше профайлером сравнить опции соединения в обоих случаях. |
||||||||
11 фев 21, 15:47 [22279557] Ответить | Цитировать Сообщить модератору |
Ennor Tiegael Member Откуда: Сообщений: 3348 |
Nevillested, И, кстати, какой-то у вас разделитель столбцов странный... вы уверены, что sqlcmd правильно интерпретирует вашу закавыченную запятую? В двойные кавычки брать ее не пробовали? |
11 фев 21, 15:49 [22279558] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 3971 |
к счастью, нет прав на создание таблиц, только на select ![]() |
||||||||
11 фев 21, 16:03 [22279570] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
Да, по неопытности своей, у меня на create-сразу сработал триггер) На код... create table #tmp (s nvarchar(10) collate cyrillic_general_cs_as); insert into #tmp(s) values (N'Abc'), (N'abc'); select * from #tmp where s like N'%ab%'; select * from #tmp where s like N'%ab%' collate cyrillic_general_ci_as; Такой результат: (2 rows affected) s - (0 rows affected) s - (0 rows affected)
Пробовал, все равно нулы.
Ох, ну тут что правда то правда, тут Вы в яблочко попали) Сообщение было отредактировано: 11 фев 21, 16:09 |
||||||||||||||||||||
11 фев 21, 16:15 [22279583] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
Nevillested, А в ssms что возвращает тот же код? И покажите, что возвращает select serverproperty('Collation') as server_collation; select databasepropertyex(db_name(), 'Collation') as db_collation; select db_name() as db_name; |
11 фев 21, 17:27 [22279620] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
![]() Прошу прощения, название бд-гос.тайна) (теперь вы понимаете да, это всё объясняет:D) Сообщение было отредактировано: 11 фев 21, 17:43 |
||||
11 фев 21, 17:49 [22279636] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
Nevillested, В ssms create table #tmp (s nvarchar(10) collate cyrillic_general_cs_as); insert into #tmp(s) values (N'Abc'), (N'abc'); select * from #tmp where s like N'%ab%'; select * from #tmp where s like N'%ab%' collate cyrillic_general_ci_as; В sqlcmd select serverproperty('Collation') as server_collation; select databasepropertyex(db_name(), 'Collation') as db_collation; select db_name() as db_name; Мне не важно знать, как база называется. Главное, чтобы совпадало в ssms и sqlcmd. |
11 фев 21, 18:00 [22279645] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
И также в ssms и sqlcmd к скрипту с табличкой #tmp добавьте запросselect * from #tmp where (s collate cyrillic_general_ci_as) like N'%ab%'; , что он вернёт |
12 фев 21, 09:12 [22279866] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
env, SQLCMD: server_collation ---------------- Cyrillic_General_CI_AS (1 rows affected) db_collation ------------ Cyrillic_General_CI_AS (1 rows affected) db_name ------- ИМЯ_БД (1 rows affected) Msg 208, Level 16, State 1, Server АДРЕС_СЕРВЕРА, Line 1 Invalid object name '#tmp'. MSSMS: (2 rows affected) s ---------- abc (1 row affected) s ---------- Abc abc (2 rows affected) s ---------- Abc abc (2 rows affected) Плохо понимаю, что происходит и как Вы диагностируете проблему (но не сомневаюсь, что получится) |
12 фев 21, 10:42 [22279897] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
Понятно. Надо как с детьми... Фраза
означает - добавьте в скрипт create table #tmp (s nvarchar(10) collate cyrillic_general_cs_as); insert into #tmp(s) values (N'Abc'), (N'abc'); select * from #tmp where s like N'%ab%'; select * from #tmp where s like N'%ab%' collate cyrillic_general_ci_as; запрос select * from #tmp where (s collate cyrillic_general_ci_as) like N'%ab%'; и выполните скрипт целиком в sqlcmd Сообщение было отредактировано: 12 фев 21, 11:02 |
||||||||
12 фев 21, 11:08 [22279910] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
совпадает с аналогичным вызовом через ssms? |
||||
12 фев 21, 11:10 [22279914] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
env, Я вас неправильно понял. Вот полный отчет на этот скрипт create table #tmp (s nvarchar(10) collate cyrillic_general_cs_as); insert into #tmp(s) values (N'Abc'), (N'abc'); select * from #tmp where s like N'%ab%'; select * from #tmp where s like N'%ab%' collate cyrillic_general_ci_as; select * from #tmp where (s collate cyrillic_general_ci_as) like N'%ab%'; Результат в MSSMS:
Результат в SQLCMD:
На этот скрипт select serverproperty('Collation') as server_collation; select databasepropertyex(db_name(), 'Collation') as db_collation; select db_name() as db_name; Результат в MSSMS:
Результат в SQLCMD:
Да, результаты совпадают |
||||
12 фев 21, 11:45 [22279933] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
Nevillested, Кажется у меня кончаются идеи. Попробуйте добавить в параметры вызова sqlcmd
-f 65001
|
12 фев 21, 12:21 [22279952] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
env, Если ставить в самое начало-выходной файл пустой, если ставить в конец, то: server_collation ---------------- Cyrillic_General_CI_AS (1 rows affected) db_collation ------------ Cyrillic_General_CI_AS (1 rows affected) db_name ------- SAS_LTL (1 rows affected) |
12 фев 21, 12:42 [22279971] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
Nevillested, Меня больше результат скрипта с #tmp табличкой интересует с этим параметром утилиты Сообщение было отредактировано: 12 фев 21, 13:59 |
12 фев 21, 14:06 [22280009] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
env, На скрипт с параметром
-f 65001
create table #tmp (s nvarchar(10) collate cyrillic_general_cs_as); insert into #tmp(s) values (N'Abc'), (N'abc'); select * from #tmp where s like N'%ab%'; select * from #tmp where s like N'%ab%' collate cyrillic_general_ci_as; select * from #tmp where (s collate cyrillic_general_ci_as) like N'%ab%'; Таков результат: (2 rows affected) s - (0 rows affected) s - (0 rows affected) s - (0 rows affected) |
12 фев 21, 14:19 [22280023] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7439 |
Nevillested, Чтобы не было недопонимания. Это результат запуска sqlcmd -S адрес_сервера -d моя_БД -E -W -Q -f 65001 "create table #tmp (s nvarchar(10) collate cyrillic_general_cs_as); insert into #tmp(s) values (N'Abc'), (N'abc'); select * from #tmp where s like N'%ab%'; select * from #tmp where s like N'%ab%' collate cyrillic_general_ci_as; select * from #tmp where (s collate cyrillic_general_ci_as) like N'%ab%';"> file.txt ? Сообщение было отредактировано: 12 фев 21, 14:17 |
12 фев 21, 14:23 [22280027] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
env,sqlcmd -S адрес_сервера -f 65001 -d моя_бд -E -s',' -W -Q "create table #tmp (s nvarchar(10) collate cyrillic_general_cs_as); insert into #tmp(s) values (N'Abc'), (N'abc'); select * from #tmp where s like N'%ab%'; select * from #tmp where s like N'%ab%' collate cyrillic_general_ci_as; select * from #tmp where (s collate cyrillic_general_ci_as) like N'%ab%';" > file.txt Вот свежак скопировал-вставил, добавил только переносы на новую строку для читабельности |
12 фев 21, 14:27 [22280030] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
Если ставить параметр -Q не непосредственно перед самим текстом моего запроса, то он дает пустой файл, т.е. как Вы показали. Скопировал Ваш код, вставил, поправил свой адрес сервера, поправил БД, поменял местами -Q и -f 65001 такой же результат: (2 rows affected) s - (0 rows affected) s - (0 rows affected) s - (0 rows affected) |
||||
12 фев 21, 14:31 [22280036] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9634 |
1. Облегчите жизнь себе и серверу и упростите запрос declare @a DATE set @a=cast(getdate() as date); SELECT top (1) a.min_run, convert(varchar,(cast((a.max_run - a.min_run) as time)), 20) as work, a.max_run, t.statik FROM [table] t cross apply ( select min(time_run), max(time_end) from [table] where cast(time_run as date) = @a and name like '%olga%' and name not like '%ivanova%' ) a(min_run, max_run); 2. Есть возможность получить планы выполнения? |
||||
12 фев 21, 16:41 [22280148] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
Колдовство! Я не понял нихрена с Вашего кода, надо сидеть прям разбираться как это вообще произошло. Заменил на свои данные, ни шагу влево/вправо Проверил в MSSQL-супер, данные такие же, как у меня Проверил в sqlcmd-снова нулы... UPD Проверил опытным путем, косяк в where: если я уберу name like '%olga%' и все остальное оставлю-отрабатывает. или если я уберу name not like '%ivanova%' и все остальное оставлю-также отрабатывает. пачиму... Сообщение было отредактировано: 12 фев 21, 18:07 |
||||||||
12 фев 21, 18:12 [22280182] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
Вот это я понимаю руки откуда надо) |
||||||||
12 фев 21, 18:15 [22280184] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
Попробовал фильтр IN и перечислил конкретно нужные statik через запятую Результат уже лучше: min_run'work'max_run'statik ---------'------------------'---------'------------- Дата_время'Время'NULL'NICE! (1 rows affected) Теперь надо понять, почему даёт null в третьем столбце, хотя в mssql никакого нула на этот же запрос нету. |
15 фев 21, 11:52 [22281007] Ответить | Цитировать Сообщить модератору |
Nevillested Member Откуда: Москва Сообщений: 31 |
Короче я немного ошибся, и все-таки работает и третий столбец. Решение конечно через костыль, но всё же...решение |
||||
15 фев 21, 16:32 [22281229] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: 1 2 [все] |
Все форумы / Microsoft SQL Server | ![]() |