【发布时间】:2021-04-06 19:48:25
【问题描述】:
我必须用 SQL 编写一个有多个条件的程序,但我不应该用多个 if else 编写它(因为 if 的成本)。我是这个领域的新手,我不知道我还能怎么写它会更好 这是我的示例代码:
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA= 'dbo' AND TABLE_NAME = 'Food_tbl')
BEGIN
IF NOT EXISTS (SELECT TOP 1 FID FROM dbo.Food_tbl)
BEGIN
INSERT INTO dbo.Food_tbl
SELECT *
FROM DataFoodView
END
ELSE IF (SELECT COUNT(*) FROM dbo.Food_tbl)=20
BEGIN
PRINT N'Table Exists'
SELECT *
FROM Food_tbl
END
ELSE IF (SELECT COUNT(*) FROM dbo.FoodSara_tbl)<>20
BEGIN
print N'there isnt 20'
INSERT INTO Food_tbl (Food_tbl.FID, Food_tbl.Fname, Food_tbl.Ftype, Food_tbl.Fcount, Food_tbl.Datetype, Food_tbl.Fdescription)
SELECT DataFoodView.*
FROM DataFoodView
LEFT JOIN FoodSara_tbl ON Food_tbl.FID = DataFoodView.FID
WHERE Food_tbl.FID IS NULL;
END
END
PS:我首先检查表是否存在,如果没有任何记录,则插入所有数据,如果有 20 条记录则显示该表,如果该表没有 20 条记录,则查找丢失的数据然后插入。
【问题讨论】:
-
考虑到涉及 2 个表,您将需要至少一个逻辑流操作。但是,如果表
Food_tbl不存在,则上述操作将失败,无论您检查它,因为解析器将失败。如果Food_tbl有可能不存在,则需要使用“动态”语句推迟编译。 -
是什么让您认为没有 20 行(不是记录)的表与它是空的有根本的不同?在这两种情况下,您都可以插入“缺失数据”。此外,正如 Larnu 所说,如果表丢失,您将收到编译错误,运行时检查无法保护您免受此错误影响。
-
为什么要故意复制数据?如果您担心成本、效率和正确性,那是您应该避免的一件事。同样奇怪的是,您有非常不同的插入语句 - 一个插入所有列,一个插入一组特定的列。不一致的代码不是一个好兆头。最后,一段代码通常应该有一个任务——它应该作为一个单元工作。您通常不会在 sql 中编写“程序”——您的目标不是很明确。
标签: sql sql-server if-statement multiple-conditions