目前我正在嘗試從我的資料庫中洗掉多個表。但只有那些名稱以特定字串開頭的名稱或表名稱與我的通配符/下劃線條件完全匹配。
在 Oracle 中,我使用了類似的東西,我正在 SQL Server Management Studio 中尋找與它等效的東西:
begin
for i in (select TABLE_NAME
from USER_TABLES
where TABLE_NAME = 'TABLE_____NAME'
)
loop
execute immediate 'DROP TABLE '||i.TABLE_NAME||' CASCADE CONSTRAINTS PURGE';
end loop;
end;
當我開始使用 SQL Server 時,我開始意識到 SQL Server 不提供簡單的回圈。
我設法創造了這樣的東西:
SELECT 'IF OBJECT_ID(''' TABLE_NAME ''') IS NOT NULL BEGIN DROP TABLE [' TABLE_NAME '] END;' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'TABLE_____NAME'
...這至少給了我一個復制粘貼的串列。我認為上面的解決方案在檢查物件 id 方面是一種但過頭了,但它作業正常。我不確定是否有必要檢查物件 ID。
最后,我正在尋找一個更簡單的解決方案,主要是像我在 Oracle 中使用的類似回圈的解決方案。我永遠不知道它將有多少張桌子,因此反解決方案(我在研究程序中經常發現)不是一種選擇(至少據我所知)。
有任何想法嗎?先感謝您。
有誰知道如何在SQL Server中實作Oracle回圈作業
uj5u.com熱心網友回復:
洗掉表大概是一個一次性程序,并且是您真正想要確定的事情。
我通常只是動態生成一個drop陳述句串列,然后您可以將其直接粘貼到 Management Studio 查詢視窗中,以直觀地確認它們是正確的,然后您就可以執行腳本了。
select Concat_Ws(' ','drop table', QuoteName(name), ';')
from sys.tables
where name like 'TABLE_____NAME'
uj5u.com熱心網友回復:
我將使用“while”來遍歷由準備好的腳本表中的標識列提取的腳本文本。
Declare @RowNumber As Int = 1
Declare @Cnt As Int
Declare @schema_name sysname = '<your schema>'
Declare @QueryText nVarChar(max)
Create Table #Script (ID Int Identity(1,1), QueryText nVarChar(max))
Insert Into #Script (QueryText)
Select Concat(N'IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''',
Quotename(@schema_name), N'.',Quotename([name]),N''') AND type in (N''U'')) DROP TABLE ',
Quotename(@schema_name), N'.',Quotename([name]))
From sys.tables
Where [name] Like 'TABLE_____NAME'
Select @Cnt = Count(*) From #Script
While (@RowNumber<=@Cnt)
Begin
Select @QueryText = QueryText From #Script Where ID=@RowNumber
Exec sp_executesql @QueryText
RAISERROR ('%s', 0, 1, @QueryText) WITH NOWAIT
Select @RowNumber=@RowNumber 1
End
或者你可以使用 string_agg 來獲取一個腳本來洗掉所有表并一次性運行它而不使用回圈。
Declare @QueryText nVarChar(max)
Declare @max nVarChar(max) = ''
Declare @schema_name sysname = '<your schema>'
Select @QueryText=String_Agg(Concat(@max, N'IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''',
Quotename(@schema_name), N'.',Quotename([name]),N''') AND type in (N''U'')) DROP TABLE ',
Quotename(@schema_name), N'.',Quotename([name])), ' ')
From sys.tables
Where [name] Like 'TABLE_____NAME'
Execute sp_executesql @QueryText
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/365091.html
標籤:sql sql-server 查询语句
