Хорошо - у меня есть ситуация, в которой я должен выполнить динамически построенную хранимую процедуру для таблиц, которые могут быть или не быть в базе данных. Полученные данные затем перенаправляются на страницу отчета на основе ASP, поддерживаемую VB.Net. По замыслу, если таблицы отсутствуют в базе данных, соответствующие данные автоматически скрываются на странице отчета. В настоящее время я делаю это, проверяя неизбежную ошибку и скрывая div в блоке catch. Немного клёвый, но это сработало.
Я не могу включить код VB, но соответствующая хранимая процедура включена ниже.
Однако, проблема с этим методом была недавно доведена до моего сведения, когда без всякой видимой причины div скрывался, хотя были доступны надлежащие данные. Как оказалось, у пользователя, пытающегося выбрать таблицу в динамическом вызове SQL, не было надлежащих разрешений на выбор, достаточно легкое исправление, как только я смог отследить его.
Итак, двойной вопрос. Прежде всего - есть ли лучший способ проверить отсутствующую таблицу, чем путем обнаружения ошибки в коде VB.Net? Учитывая все обстоятельства, я бы предпочел сохранить проверку на наличие ошибок. Во-вторых, есть ли предпочтительный метод для извлечения конкретной ошибки OLE DB из общего объекта, перехваченного блоком try-> catch, кроме простой проверки фактической строки трассировки стека?
SQL-запрос. Основная суть кода заключается в том, что из-за структуры базы данных я должен вручную определить имя целевой таблицы. База данных записывает задания в одну таблицу, но у каждого задания также есть своя собственная таблица для обработки данных об элементах, обработанных в этом задании, и данные из этих таблиц, которые мне нужно извлечь. К сожалению, я ничего не могу с этим поделать.
DECLARE @sql NVarChar(Max),
@params NVarChar(Max),
@where NVarChar(Max)
-- Retained for live testing of stored procedure.
-- DECLARE @Table NvarChar(255) SET @Table = N'tblMSGExportMessage_10000'
-- DECLARE @AcctID Integer SET @AcctID = 10000
-- DECLARE @Type Integer SET @Type = 0 -- 0 = Errors only, 1 = All Messages
-- DECLARE @Count Integer
-- Sets our parameters for our two dynamic SQL calls.
SELECT @params = N'@MsgExportAccount INT, @cnt INT OUTPUT'
-- Sets our where clause dependent upon whether we want all results or just errors.
IF @Type = 0
BEGIN
SELECT @where =
N' AND ( mem.[MSGExportStatus_OPT_CD] IN ( 11100, 11102 ) ' +
N' OR mem.[IngestionStatus_OPT_CD] IN ( 11800, 11802, 11803 ) ' +
N' OR mem.[ShortcutStatus_OPT_CD] IN ( 11500, 11502 ) ) '
END
ELSE
BEGIN
SELECT @where = N' '
END
-- Retrieves a count of messages.
SELECT @sql =
N'SELECT @cnt = Count( * ) FROM dbo.' + QuoteName( @Table ) + N' AS mem ' +
N'WHERE mem.[MSGExportAccount_ID] = @MsgExportAccount ' + @where
EXEC sp_executesql @sql, @params, @AcctID, @cnt = @Count OUTPUT