mohamad_ali Ответов: 1

Как можно использовать сложные SQL-инструкции Select в SQL зависимостей


Привет я использую sqldependecy чтобы получить уведомление от sqlserver и использовать signalr для отправки сигнала тревоги некоторым пользователям которые хранятся в базе данных

до этого я посылал сигнал тревоги для всех пользователей и использовал простой выбор но теперь я хочу использовать сложный выбор

Что я уже пробовал:

Выберите [CarrierFid], [pelacknumber], [Speed], [Timeoverspeed] из [dbo].[OverSpeedAlert]



Я хочу использовать следующий select вместо приведенного выше select :

var queries = new[]{ @"SELECT [CarrierFid], [pelacknumber], [Speed], [Timeoverspeed] FROM [dbo].[OverSpeedAlert] "+
                                     " WHERE visited = 0 AND  CONVERT(varchar(10), Timeoverspeed )= FORMAT(GETDATE(),'dd/MM/yyyy')  "+
                                      " and CarrierFid in ( "+
                                       " SELECT dbo.AlarmsCarrier.carrierFid "+
                                               " FROM dbo.AlarmsCarrier INNER JOIN  "+
                                                    " dbo.AlarmUsers ON dbo.AlarmsCarrier.AlarmCarrierid = dbo.AlarmUsers.AlarmCarrierFid INNER JOIN "+
                                                      " dbo.Users ON dbo.AlarmUsers.UserFid = dbo.Users.ID "+
                                                          " WHERE (dbo.Users.UserName = '"+ username +"'))" };

mohamad_ali

thnx, хорошо, я изменю его

1 Ответов

Рейтинг:
9

Richard Deeming

Этот запрос не может быть использован с a SqlDependency:

Уведомления о запросах поддерживаются для операторов SELECT, отвечающих следующим требованиям:

Оператор не должен содержать подзапросов…

Оператор не должен использовать никакие недетерминированные функции…
Ваш In предложение использует подзапрос, и GETDATE является недетерминированным.


mohamad_ali

Какое решение вы предлагаете для этой проблемы? я должен посылать сигнал тревоги конкретным пользователям и использовать внутреннее соединение между некоторыми таблицами

Richard Deeming

Настройте уведомление на более простой запрос - например:

SELECT dbo.AlarmsCarrier.carrierFid, dbo.AlarmUsers.UserFid
FROM dbo.AlarmsCarrier INNER JOIN dbo.AlarmUsers 
ON dbo.AlarmsCarrier.AlarmCarrierid = dbo.AlarmUsers.AlarmCarrierFid


Это уведомит вас, когда сигнал тревоги будет добавлен или изменен.

Затем вы можете запустить свой запрос, чтобы найти сигналы тревоги, которые вам нужно отправить.

mohamad_ali

я использовал getdate для отображения сегодняшних сообщений если я удалю это условие через несколько дней, то будет отображаться много сообщений

Richard Deeming

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

Maciej Los

5ed!

mohamad_ali

я уже делал это раньше ,но dosent fire sqldependency
я использую 2 запроса первый простой для проверки уведомления и второй для отображения некоторого сообщения но дозент работает на дисплее сигнал тревоги в реальном времени отображается только после обновления страницы

Richard Deeming

Зависимость SQL должна срабатывать при возврате данных отслеживаемым пользователем SELECT заявление меняется.

Если он не срабатывает, то, возможно, что-то не так с настройкой вашего сервисного брокера.

Если он запускает, но не уведомляет пользователя, значит, что-то не так с кодом, который отправляет уведомления.

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

Richard Deeming

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

mohamad_ali

хорошо,thnx много для вашего гида,и для того, чтобы дать мне ваше время