Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 NULL SQLCMD  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3970
"Это может помочь в решении-если из подзапросов1/2 убрать WHERE, не дает нулы, но дело в том, что where мне там нужно)
Есть мысли?"

А где же там вхере?
10 фев 21, 17:04    [22279005]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7435
Nevillested,

От collation, до ansi nulls - показывайте подробнее
10 фев 21, 17:19    [22279014]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8314
Nevillested,

напишите

set ansi_nulls on; declare @a ...


и попробуйте

set ansi_nulls off; declare @a ...


Сообщение было отредактировано: 10 фев 21, 17:42
10 фев 21, 17:48    [22279030]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
Nevillested
Member

Откуда: Москва
Сообщений: 31
env
Nevillested,

От collation, до ansi nulls - показывайте подробнее


Что показывать? Не совсем Вас понял

Владислав Колосов
Nevillested,

напишите

set ansi_nulls on; declare @a ...


и попробуйте

set ansi_nulls off; declare @a ...


не сработало

Ролг Хупин
"Это может помочь в решении-если из подзапросов1/2 убрать WHERE, не дает нулы, но дело в том, что where мне там нужно)
Есть мысли?"

А где же там вхере?

Я его уместил в "подзапрос". Ниже все так как есть, только там еще идет 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]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
Nevillested,

А time_run какого типа? varchar(n)?
11 фев 21, 10:25    [22279334]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
Nevillested
Member

Откуда: Москва
Сообщений: 31
invm,

datetime все, кроме statik
11 фев 21, 11:05    [22279366]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
Nevillested
datetime все
Тогда, очень вероятно, вы не в той БД запускаете скрипт.
11 фев 21, 11:17    [22279377]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7435
Nevillested
Что показывать?

Полный запрос. И уточнить типы данных по каждому полю, к которому применяются фильтры или по которому возможна сортировка результата.

Код в 22279319 соответствует действительности или есть какие-то опущенные фильтры?
11 фев 21, 11:17    [22279378]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
Nevillested
Member

Откуда: Москва
Сообщений: 31
invm
Nevillested
datetime все
Тогда, очень вероятно, вы не в той БД запускаете скрипт.

Проверил БД, проверил сервер, всё то, что надо, даже коллегу попросил посмотреть, не долблюсь ли я в глаза. Кажется, оба долбимся.
env
Nevillested
Что показывать?

Полный запрос. И уточнить типы данных по каждому полю, к которому применяются фильтры или по которому возможна сортировка результата.

Код в 22279319 соответствует действительности или есть какие-то опущенные фильтры?

Вот прямо-таки полный со всеми фильтрами

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]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7435
Nevillested
name like N'%olga%' and name not like N'%ivanova%'


упд. Возможно ещё явно стоит указать, COLLATE для литералов, чтобы был явный _CI

Сообщение было отредактировано: 11 фев 21, 11:34
11 фев 21, 11:38    [22279393]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
Nevillested
Member

Откуда: Москва
Сообщений: 31
env
Nevillested
name like N'%olga%' and name not like N'%ivanova%'


упд. Возможно ещё явно стоит указать, COLLATE для литералов, чтобы был явный _CI

что за N? В моем коде такого нет
Не совсем Вас понял, что значит указать COLLATE для литералов, чтобы был явный _CI?
11 фев 21, 11:49    [22279409]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7435
Nevillested
В моем коде такого нет

Добавьте и запустите.
11 фев 21, 11:55    [22279414]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7435
Nevillested
что значит указать COLLATE для литералов, чтобы был явный _CI

Ровно то, что написано - добавить после литерала инструкцию COLLATE с совпадающими для ваших nvarchar полей значениями кодовой страницы и параметров сортировки и явным указанием Case Insensitive, если нет уверенности, что значения в таблице также как и в литерале строго в нижнем регистре.
11 фев 21, 11:58    [22279419]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
Nevillested
Member

Откуда: Москва
Сообщений: 31
env
Nevillested
В моем коде такого нет

Добавьте и запустите.

Не сработало
env
Nevillested
что значит указать COLLATE для литералов, чтобы был явный _CI

Ровно то, что написано - добавить после литерала инструкцию COLLATE с совпадающими для ваших nvarchar полей значениями кодовой страницы и параметров сортировки и явным указанием Case Insensitive, если нет уверенности, что значения в таблице также как и в литерале строго в нижнем регистре.

Не понимаю того, что Вы говорите, просто потому что не знаю, что вообще это такое. Сейчас погуглю, разберусь и дам знать о результатах позже
11 фев 21, 12:13    [22279426]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7435
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]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
Nevillested,

Клиент и sqlcmd работают под одним и тем же логином?
11 фев 21, 12:29    [22279441]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
Nevillested
Member

Откуда: Москва
Сообщений: 31
env
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
к сожалению, нет прав на создание таблиц, только на select

invm, да, под одним и тем же логином
11 фев 21, 14:57    [22279522]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3348
Nevillested
env
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
к сожалению, нет прав на создание таблиц, только на select

invm, да, под одним и тем же логином
Нет прав на создание таблиц, говорите. Т.е. вы даже не попробовали выполнить этот код.
11 фев 21, 15:45    [22279554]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
Nevillested
к сожалению, нет прав на создание таблиц
Временные таблицы могут создавать все.
Nevillested
invm, да, под одним и тем же логином
Тогда клиент (если это SSMS) и sqlcmd и если все настройки по-дефолту, должны отличаться только в части quoted_identifier.
Добавьте к вызову sqlcmd ключ -I
А вообще, лучше профайлером сравнить опции соединения в обоих случаях.
11 фев 21, 15:47    [22279557]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3348
Nevillested,

И, кстати, какой-то у вас разделитель столбцов странный... вы уверены, что sqlcmd правильно интерпретирует вашу закавыченную запятую? В двойные кавычки брать ее не пробовали?
11 фев 21, 15:49    [22279558]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3970
Nevillested
env
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
к сожалению, нет прав на создание таблиц, только на select

invm, да, под одним и тем же логином


к счастью, нет прав на создание таблиц, только на select

11 фев 21, 16:03    [22279570]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
Nevillested
Member

Откуда: Москва
Сообщений: 31
Ennor Tiegael
Nevillested
пропущено...
к сожалению, нет прав на создание таблиц, только на select

invm, да, под одним и тем же логином
Нет прав на создание таблиц, говорите. Т.е. вы даже не попробовали выполнить этот код.

Да, по неопытности своей, у меня на 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)


Ennor Tiegael
Nevillested,

И, кстати, какой-то у вас разделитель столбцов странный... вы уверены, что sqlcmd правильно интерпретирует вашу закавыченную запятую? В двойные кавычки брать ее не пробовали?


Пробовал, все равно нулы.


Ролг Хупин
Nevillested
пропущено...
к сожалению, нет прав на создание таблиц, только на select

invm, да, под одним и тем же логином


к счастью, нет прав на создание таблиц, только на select



Ох, ну тут что правда то правда, тут Вы в яблочко попали)

Сообщение было отредактировано: 11 фев 21, 16:09
11 фев 21, 16:15    [22279583]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7435
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]     Ответить | Цитировать Сообщить модератору
 Re: NULL SQLCMD  [new]
Nevillested
Member

Откуда: Москва
Сообщений: 31
env
Nevillested,

А в ssms что возвращает тот же код? И покажите, что возвращает

select serverproperty('Collation') as server_collation;
select databasepropertyex(db_name(), 'Collation') as db_collation;
select db_name() as db_name;

Картинка с другого сайта.

Прошу прощения, название бд-гос.тайна)
(теперь вы понимаете да, это всё объясняет:D)

Сообщение было отредактировано: 11 фев 21, 17:43
11 фев 21, 17:49    [22279636]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить