Проверить и вернуть строки, если таблица 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 Строка] Операторы выбора, включенные в функцию, не могут возвращать данные клиенту.
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
Используйте 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
Это будет работать! Вам нужно вернуть данные в запросе как 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