SQL語句大全(3)

  • 2020 年 1 月 14 日
  • 筆記

1、1=1,1=2的使用,在SQL語句組合時用的較多

「where 1=1」 是表示選擇全部    「where 1=2」全部不選,   如:   if @strWhere !=''    begin   set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere    end   else    begin   set @strSQL = 'select count(*) as Total from [' + @tblName + ']'    end 

我們可以直接寫成

錯誤!未找到目錄項。 set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere 2、收縮資料庫 –重建索引 DBCC REINDEX DBCC INDEXDEFRAG –收縮數據和日誌 DBCC SHRINKDB DBCC SHRINKFILE

3、壓縮資料庫 dbcc shrinkdatabase(dbname)

4、轉移資料庫給新用戶以已存在用戶許可權 exec sp_change_users_login 'update_one','newname','oldname' go

5、檢查備份集 RESTORE VERIFYONLY from disk='E:dvbbs.bak'

6、修復資料庫 ALTER DATABASE [dvbbs] SET SINGLE_USER GO DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK GO ALTER DATABASE [dvbbs] SET MULTI_USER GO

7、日誌清除 SET NOCOUNT ON DECLARE @LogicalFileName sysname,  @MaxMinutes INT,  @NewSize INT

USE tablename — 要操作的資料庫名 SELECT  @LogicalFileName = 'tablename_log', — 日誌文件名 @MaxMinutes = 10, — Limit on time allowed to wrap log.  @NewSize = 1  — 你想設定的日誌文件的大小(M)

Setup / initialize DECLARE @OriginalSize int SELECT @OriginalSize = size   FROM sysfiles  WHERE name = @LogicalFileName SELECT 'Original Size of ' + db_name() + ' LOG is ' +   CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +   CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'  FROM sysfiles  WHERE name = @LogicalFileName CREATE TABLE DummyTrans  (DummyColumn char (8000) not null)

DECLARE @Counter    INT,  @StartTime DATETIME,  @TruncLog   VARCHAR(255) SELECT @StartTime = GETDATE(),  @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

DBCC SHRINKFILE (@LogicalFileName, @NewSize) EXEC (@TruncLog) — Wrap the log if necessary. WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) — time has not expired  AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)    AND (@OriginalSize * 8 /1024) > @NewSize    BEGIN — Outer loop. SELECT @Counter = 0  WHILE   ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))  BEGIN — update  INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans  SELECT @Counter = @Counter + 1  END  EXEC (@TruncLog)    END SELECT 'Final Size of ' + db_name() + ' LOG is ' +  CONVERT(VARCHAR(30),size) + ' 8K pages or ' +   CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'  FROM sysfiles   WHERE name = @LogicalFileName DROP TABLE DummyTrans SET NOCOUNT OFF 

8、說明:更改某個表 exec sp_changeobjectowner 'tablename','dbo'

9、存儲更改全部表

CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch @OldOwner as NVARCHAR(128), @NewOwner as NVARCHAR(128) AS

DECLARE @Name    as NVARCHAR(128) DECLARE @Owner   as NVARCHAR(128) DECLARE @OwnerName   as NVARCHAR(128)

DECLARE curObject CURSOR FOR  select 'Name'    = name,    'Owner'    = user_name(uid) from sysobjects where user_name(uid)=@OldOwner order by name

OPEN   curObject FETCH NEXT FROM curObject INTO @Name, @Owner WHILE(@@FETCH_STATUS=0) BEGIN      if @Owner=@OldOwner  begin    set @OwnerName = @OldOwner + '.' + rtrim(@Name)    exec sp_changeobjectowner @OwnerName, @NewOwner end — select @name,@NewOwner,@OldOwner

FETCH NEXT FROM curObject INTO @Name, @Owner END

close curObject deallocate curObject GO

10、SQL SERVER中直接循環寫入數據 declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i+1 end 案例: 有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:

Name     score

Zhangshan 80

Lishi  59

Wangwu  50

Songquan 69

while((select min(score) from tb_table)<60)

begin

update tb_table set score =score*1.01

where score<60

if  (select min(score) from tb_table)>60

  break

 else

    continue

end