Проверить и вернуть строки, если таблица SQL Server существует

Я работаю над приложением, которое включает таблицы SQL Server. Я пишу запрос, в котором мне нужно проверить таблицу, и если таблица существует, мне нужно выбрать записи из этой таблицы, и если таблица не существует в этой базе данных, мне нужно выбрать из другой таблицы.

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

Есть какой-либо способ сделать это?

CREATE FUNCTION dbo.udf_school_information 
    (@univ_id INT)
RETURNS @returntable TABLE
(
    univ_id INT,
    school_number INT,
    school_name NVARCHAR(255),
    school_address NVARCHAR(255),
    state NVARCHAR(150),
    district NVARCHAR(100),
    start_date datetime
)
AS
BEGIN
    DECLARE @tbl_exists BIT;

    SET @tbl_exists = ISNULL((SELECT 1 FROM INFORMATION_SCHEMA.TABLES 
                              WHERE Table_Name LIKE '%School'),0)

    IF @tbl_exists = 1      
    BEGIN
        SELECT 
            university_id, school_number, school_name, 
            school_address, school_state, district, school_started_date 
        FROM 
            [dbo].[tbl_school_info] 
        WHERE 
            id = @univ_id
    END
    ELSE
    BEGIN
        ---- My condition if school_ingo table does not exists 
        ---- will be querying another table.
    END

    RETURN;
END;
GO

Выше выдает ошибку

Сообщение 444, уровень 16, состояние 2, процедура udf_site_information, строка 24 [строка запуска пакета 15] Операторы Select, включенные в функцию, не могут возвращать данные клиенту.


person Karthik Venkatraman    schedule 28.08.2018    source источник
comment
почему ваш подход не работает? вы получаете ошибку?   -  person linden.phoenix    schedule 28.08.2018
comment
@linden.phoenix Обновлена ​​ошибка.   -  person Karthik Venkatraman    schedule 28.08.2018
comment
Тогда используйте мой ответ.   -  person Andrey Stukalin    schedule 28.08.2018
comment
да, вам нужно ВСТАВИТЬ В @returntable SELECT University_id, ...   -  person linden.phoenix    schedule 28.08.2018


Ответы (3)


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

insert into @returntable
SELECT university_id,...

Добавьте это, и это должно работать. И эту проверку существования тоже поменяй, потому что все думают, что проблема в нем :)

Вы должны быть в состоянии просто использовать эту форму

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Feeds]') AND type in (N'U'))
  --abc
ELSE
  -- xyz

То же самое с information_schema:

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME like 'feeds')
BEGIN
 print 'exists'
END
person Andrey Stukalin    schedule 28.08.2018

Используйте OBJECT_ID() с N'U' в качестве типа объекта:

CREATE FUNCTION dbo.udf_school_information (@univ_id INT)
RETURNS @returntable TABLE
(
    univ_id INT,
    school_number INT,
    school_name NVARCHAR(255),
    school_address NVARCHAR(255),
    state NVARCHAR(150),
    district NVARCHAR(100),
    start_date datetime
)
AS
BEGIN
    DECLARE @tbl_exists BIT;

    IF OBJECT_ID(N'[dbo].[tbl_school_info]', N'U') IS NOT NULL SET @tbl_exists = 1
    ELSE SET @tbl_exists = 0;

    IF @tbl_exists = 1      
    BEGIN
       -- Statements
    ELSE
    BEGIN
        -- My condition if school_ingo table does not exists 
        -- will be querying another table.
    END
END;
GO
person Zhorov    schedule 28.08.2018

Это сработает! Вам нужно вернуть данные в запрос как variable. Вам нужно определить все переменные, которые вы хотите использовать в качестве вывода. я изменил ваш пример с моим примером фиктивных таблиц. Вы можете использовать в соответствии с вашими требованиями Позвольте мне привести вам один пример

ALTER FUNCTION dbo.udf_school_information (@univ_id INT)
RETURNS @returntable TABLE
(
    univ_id INT

)
AS
BEGIN

    declare @tbl_exists bit
    Declare @Outputdata varchar(100)

    IF OBJECT_ID(N'[dbo].[tblprojectresource]', N'U') IS NOT NULL SET @tbl_exists = 1
    ELSE SET @tbl_exists = 0;

    IF @tbl_exists = 1      
    BEGIN
        select @Outputdata =ProjectResourceId from tblProjectResource Where ProjectResourceId =@univ_id
       -- Statements
    END
    ELSE
    BEGIN
        select @Outputdata =ProjectId from tblprojectmaster Where projectid =@univ_id
    END
END;
GO
person gulshan arora    schedule 28.08.2018
comment
Ваш код, вероятно, не будет работать, поскольку вы выбираете @outputdata и все еще не заполняете @returntable - person Andrey Stukalin; 28.08.2018
comment
Просто заполните свой @returntable в конце. это сработает. Пробовал на локалке, работает - person gulshan arora; 28.08.2018