Tên bảng là Scores
.
Là chính xác để làm như sau?
IF EXISTS(SELECT *
FROM dbo.Scores)
DROP TABLE dbo.Scores
Tên bảng là Scores
.
Là chính xác để làm như sau?
IF EXISTS(SELECT *
FROM dbo.Scores)
DROP TABLE dbo.Scores
Câu trả lời:
Là chính xác để làm như sau?
IF EXISTS(SELECT * FROM dbo.Scores) DROP TABLE dbo.Scores
Không. Điều đó sẽ làm rơi bảng chỉ khi nó chứa bất kỳ hàng nào (và sẽ phát sinh lỗi nếu bảng không tồn tại).
Thay vào đó, đối với một bảng vĩnh viễn, bạn có thể sử dụng
IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL
DROP TABLE dbo.Scores;
Hoặc, đối với một bảng tạm thời, bạn có thể sử dụng
IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
DROP TABLE #T;
SQL Server 2016+ có cách tốt hơn, sử dụng DROP TABLE IF EXISTS …
. Xem câu trả lời của @Jovan .
Từ SQL Server 2016 bạn có thể sử dụng
DROP TABLE IF EXISTS dbo.Scores
Tham khảo: DROP NẾU EXISTS - điều mới trong SQL Server 2016
Nó sẽ có trong Cơ sở dữ liệu SQL Azure sớm.
Cách ANSI SQL / đa nền tảng là sử dụng Information_SCHema , được thiết kế riêng để truy vấn dữ liệu meta về các đối tượng trong cơ sở dữ liệu SQL.
if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'Scores' AND TABLE_SCHEMA = 'dbo')
drop table dbo.Scores;
Hầu hết các máy chủ RDBMS hiện đại đều cung cấp, ít nhất là hỗ trợ Information_SCHema cơ bản, bao gồm: MySQL , Postgres , Oracle , IBM DB2 và Microsoft SQL Server 7.0 (và cao hơn) .
if exists
ansi phù hợp?
Đã thấy rất nhiều mà không thực sự làm việc. khi một bảng tạm thời được tạo, nó phải bị xóa khỏi tempdb!
Mã duy nhất hoạt động là:
IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL --Remove dbo here
DROP TABLE #tempdbname -- Remoeve "tempdb.dbo"
dbo
để tempdb
thực hiện công việc này. Tôi cũng muốn đề xuất thêm 'u'
như đã đề cập trong các bình luận của câu trả lời được chấp nhận. Do đó, câu lệnh IF đầy đủ sẽ giống như thế này:IF OBJECT_ID('tempdb..#temp', 'U')
Trong SQL Server 2016 (13.x) trở lên
DROP TABLE IF EXISTS dbo.Scores
Trong các phiên bản trước
IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL
DROP TABLE dbo.Scores;
Bạn là của bạntable type
Hoặc là:
if exists (select * from sys.objects where name = 'Scores' and type = 'u')
drop table Scores
if exists (select * from sys.tables where name = 'Scores') drop table Scores
Tôi đã viết một UDF nhỏ trả về 1 nếu đối số của nó là tên của một bảng còn lại, 0 nếu không:
CREATE FUNCTION [dbo].[Table_exists]
(
@TableName VARCHAR(200)
)
RETURNS BIT
AS
BEGIN
If Exists(select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = @TableName)
RETURN 1;
RETURN 0;
END
GO
Để xóa bảng User
nếu nó tồn tại, hãy gọi nó như vậy:
IF [dbo].[Table_exists]('User') = 1 Drop table [User]
Đơn giản là:
IF OBJECT_ID(dbo.TableName, 'U') IS NOT NULL
DROP TABLE dbo.TableName
nơi dbo.TableName
là bảng mong muốn của bạn và 'U' là type
của bạn table
.
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
DROP TABLE Scores
GO
Tôi sử dụng:
if exists (select *
from sys.tables
where name = 'tableName'
and schema_id = schema_id('dbo'))
begin
drop table dbo.tableName
end
Co một cach dê dang hơn
DROP TABLE IF EXISTS table_name;
Một cách trực quan và dễ dàng hơn, nếu bạn đang sử dụng Visual Studio, chỉ cần mở từ thanh menu,
Xem -> SQL Server Object Explorer
nó sẽ mở như hiển thị ở đây
Chọn và Nhấp chuột phải vào Bảng bạn muốn xóa, sau đó xóa. Một màn hình như vậy nên được hiển thị. Nhấp vào Cập nhật cơ sở dữ liệu để xác nhận.
Phương pháp này rất an toàn vì nó cung cấp cho bạn thông tin phản hồi và sẽ cảnh báo mọi mối quan hệ của bảng đã xóa với các bảng khác.
SQL
, không liên quan đến Visual Studio
. Do đó, câu trả lời này không liên quan đến câu hỏi này.
Làm như thế này, đó là cách dễ nhất.
qry
sẽ là truy vấn của riêng bạn, bất cứ điều gì bạn muốn trong danh sách chọn.
set @qry = ' select * into TempData from (' + @qry + ')Tmp '
exec (@qry)
select * from TempData
drop table TempData
'U'
số thứ hai rõ ràng có nghĩa là "Chỉ tìm các đối tượng có tên này là bảng". Một nguồn . Vì vậy,OBJECT_ID('TableName')
không sai , nhưng nó cũng không hoàn toàn chính xác, do đó,'U'
trong câu trả lời tuyệt vời của @ Martin.