SQL Server, где сравнения пунктов с различными типами и поведением кастинга значения по умолчанию

Я выяснил, что значения TimeStamp не являются строковыми. Спасибо @meW за упоминание о том, что в данных могут быть некоторые проблемы.

Итак, я преобразовал значения в строку перед преобразованием времени строковых данных в эпоху.

dataframe['TimeStamp'] = dataframe['TimeStamp'].astype(str)
dataframe['TimeStamp'] = pd.to_datetime(dataframe['TimeStamp'])
                          .values.astype(np.int64) // 10 ** 6
5
задан Eoin Campbell 6 May 2009 в 18:57
поделиться

6 ответов

Data type precedence is well defined - http://msdn.microsoft.com/en-us/library/ms190309.aspx

Edit - to clarify, it is not that sql always converts the column type to the param type. It just follows the type precedence in the link I gave. This could mean the param gets converted to the column type, if the type precedence dictates so.

4
ответ дан 14 December 2019 в 13:46
поделиться

Я не вижу, в чем проблема. Почему SQL-сервер знает, что запись # 232 из 1000 будет бомбить? Нет, пока не доберется до этой записи.

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

Чего еще ожидать?

1
ответ дан 14 December 2019 в 13:46
поделиться

Вы прекрасно описываете, что происходит, поэтому я не понимаю, что вы хотели бы знать, чего еще не знаете?

Исправить запрос достаточно просто, просто спросите Sql Сервер для преобразования вашего параметра в varchar вместо преобразования столбца varchar в bigint:

SELECT * FROM Phones WHERE Mobile = cast(@biMobile_1 as varchar(50))
0
ответ дан 14 December 2019 в 13:46
поделиться

Ваше логическое описание процесса действительно правильное.

SQL Server - это простота, применяя функцию Cast / Convert к мобильному столбцу (в данном случае неявное преобразование из nvarchar). в Bigint). Функции, конечно, применяются по принципу строка за строкой , и, следовательно, поведение, которое вы наблюдаете, в результате чего оператор SELECT не выполняет бомбардировку, пока не прекратится функция приведения.

Эту проблему можно избежать путем преобразования одиночная числовая переменная, которая ищется (@ biMobile_2) для nvarchar, вместо того, чтобы неявно преобразовывать столбец Mobile для всех строк.

Например:

SELECT * FROM Phones WHERE Mobile = convert(nvarchar,@biMobile_2)

Надеюсь, это поможет.

0
ответ дан 14 December 2019 в 13:46
поделиться

Проблема в том, что неявное преобразование из nvarchar в bigint недопустимо, только если содержимое nvarchar содержит нечисловые символы. Ядро базы данных не будет выполнять запрос один раз только для того, чтобы проверить каждое значение, которое будет возвращено , чтобы убедиться, что отправленный вами запрос действителен для каждой строки, только для того, чтобы затем развернуться и выполнить запрос снова, чтобы вернуть результаты.

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

0
ответ дан 14 December 2019 в 13:46
поделиться

Лично вместо того, чтобы преобразовывать параметр в правильный тип, я бы для начала объявил его как этот тип.

1
ответ дан 14 December 2019 в 13:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: