1

Я работаю над модулем отчетности для проекта компании. Хотя мы используем ORM для нашего приложения, я решил написать хранимые процедуры для отчетов в ожидании перехода на SSRS.Ошибка параметра таблицы в SQL Server

Эти хранимые процедуры требуют ввода значений параметров таблицы. Таким образом, я создал свой тип таблицы:

USE MyDatabase 
GO 

/****** Object: UserDefinedTableType [dbo].[IntList] Script Date: 5/8/2013 5:20:59 PM ******/ 
CREATE TYPE [dbo].[IntList] AS TABLE(
    [Id] [int] NOT NULL, 
    PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (IGNORE_DUP_KEY = OFF) 
) 
GO 

У меня есть следующий SQL Server хранимая процедура:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
USE MyDatabase 
GO 
-- ============================================= 
-- Author:  <lunchmeat317> 
-- Create date: <05/06/2013> 
-- Description: <File Type Report> 
-- ============================================= 
ALTER PROCEDURE Report_FileType 
    @filetype varchar(20) = null, 
    @User intList READONLY, 
    @Group intList READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    /* 
    lf = LibraryFile 
    lfu = LibraryFileAssignedUser 
    lfg = LibraryFileAssignedGroup 
    */ 

    SELECT Extension AS FileType, COUNT(1) AS TotalFiles 
    FROM LibraryFile lf 
    LEFT JOIN LibraryFileAssignedUser lfu 
     ON (SELECT COUNT(1) FROM @User) != 0 
     AND lfu.LibraryFileId = lf.Id 
    LEFT JOIN LibraryFileAssignedGroup lfg 
     ON (SELECT COUNT(1) FROM @Group) != 0 
     AND lfg.LibraryFileId = lf.Id 
    WHERE ((@filetype IS NULL) OR (Extension = @filetype)) 
    AND (
     ((@User IS NULL) OR (lfu.UserId IN (SELECT * FROM @User))) 
     OR ((@Group IS NULL) OR (lfg.HubGroupId IN (SELECT * FROM @Group))) 
    ) 
    GROUP BY Extension 
END 
GO 

При попытке изменить хранимую процедуру, я постоянно получаю сообщение об ошибке

Msg 137, Level 16, State 1, Procedure Report_FileType 
Must declare the scalar variable "@User". 
Msg 137, Level 16, State 1, Procedure Report_FileType 
Must declare the scalar variable "@Group". 

Я не могу понять, почему это происходит. Если я использую скалярный тип (и обновляю свой код для соответствия), он работает. Однако, когда я пытаюсь использовать TVP, я не могу скомпилировать хранимую процедуру.

Для чего это необходимо, я добавил этот тип, но я еще не установил его. Однако я не ожидаю, что это приведет к ошибке компиляции; это приведет к ошибке во время выполнения (о чем я уже говорил ранее).

Есть ли у кого-нибудь опыт в этой проблеме? Благодаря!

+0

Какие SQL версии сервера и совместимости баз данных уровней? –

ответ

1

Интересно, я не использовал это раньше, но кажется, что вы не можете проверить @User/@Group IS NULL, так как это таблица.
Cf.

https://dba.stackexchange.com/questions/30754/how-do-i-check-for-a-null-or-empty-table-valued-parameter

http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/c59f6b82-7639-42c7-ad90-a4ec7315a3bd/

+0

К сожалению, я забыл изменить эти строки кода. Будет редактировать. –

+1

Изменены эти строки для операторов SELECT и скомпилированы. Полностью пропустил, что - наличие дополнительной пары глаз отлично! Я был убежден, что это не проблема синтаксиса. Благодаря! –

Смежные вопросы