SQL Generic Queries
1. Shrink all databases
2. Index Rebuild All databases
3. CPU Utilization
4. Table comparison
5. List of files with directory
name and creation date
6. SPLIT Function
7. Remove Multiple Space into
single space
8. Remove New line char Multiple
Space from String
9. Fetch String Data Only
10. Fetch Digits Only
11. Word Count Function
12. SP_ ExecuteSQL Example
13. SP_ MSforeachtable Example
Shrink All databases
SET NOCOUNT ON
DECLARE @tbl TABLE
(
ID INT IDENTITY(1,1),
DBNAME NVARCHAR(1000),
[FileName] NVARCHAR(1000)
)
INSERT INTO @tbl
SELECT DB_NAME(DbID),st.NAme from sys.sysaltfiles
ST INNER JOIN
Sys.databases SB on ST.dbid = sb.database_id
where
st.dbid>6 --sb.NAme not in
('master','tempdb','model','msdb','ReportServer','ReportServerTempDB')
And FileName LIKE '%ldf' and sb.state = 0 And state_desc = 'ONLINE'
DECLARE @MinID INT , @MaxID INT,@DBName NVARCHAR(1000),@FileName NVARCHAR(1000),@RecoveryModel
NVARCHAR(1000),@SQL NVARCHAR(MAX)
SELECT @MinID = MIN(ID),@MaxID = MAX(ID) FROM @tbl
WHILE(@MinID <=@MaxID)
BEGIN
SELECT @DBName = DBNAME,@FileName=[FileName] FROM @tbl
where ID =
@MinID
SELECT @RecoveryModel =
recovery_model_desc FROM sys.databases where name
= @DBName
SELECT @SQL= N'USE
['+ @DBName+']'+CHAR(10)
+CASE
WHEN @RecoveryModel <>
N'SIMPLE' THEN N'ALTER DATABASE ['+@DBName+'] SET RECOVERY SIMPLE WITH
NO_WAIT' ELSE N''END+CHAR(10)
+N'DBCC
SHRINKFILE(N'+Quotename(@FileName,'''')+',1)'+CHAR(10)
+CASE
WHEN @RecoveryModel <>
N'SIMPLE' THEN N'ALTER DATABASE ['+@DBName+'] SET RECOVERY '+@RecoveryModel+N' WITH NO_WAIT'+CHAR(10) ELSE N'' END
--Print(@SQL)
EXEC SP_EXECUTESQL @SQL
SELECT @MinID = @MinID +1
END
SET NOCOUNT OFF
Shrink all DBs
-- Description:
Maintanace Activity : SP to generate script to shrink the huge databases
--
=============================================
--Exec
Shrink_All_DB
CREATE Proc [dbo].[Shrink_All_DB]
As
SET NOCOUNT ON
Select dbid,DB_NAME(dbid) As DBName,recovery_model_desc
INTO
#Orig_DB_State
From sys.sysaltfiles A Inner Join sys.databases B
On A.[dbid] = B.[database_id]
Where Right([filename],3)='ldf'
And [Size] >
1000
Order By Dbid
Print 'XP_Fixeddrives'
Print ('Go')
Declare @DBName Varchar(100),@Rec_Mod Varchar(100),@SQL Varchar(300), @DB_FileName Varchar(100)
Declare
CHANGE_Recovery_CURSOR Cursor for
Select DBName,recovery_model_desc
from #Orig_DB_State
open
CHANGE_Recovery_CURSOR
Fetch next from
CHANGE_Recovery_CURSOR INTO @DBName,@Rec_Mod
while @@Fetch_Status=0
BEGIN
Exec ('Use ['+@DBName+']')
Print ('Use '+Quotename(@DBName,'[]'))
Print ('Go')
--Exec (@SQL)
Select @DB_FileName = name From sys.sysaltfiles Where Right([filename],3)='ldf' And DB_NAME(dbid) = @DBName
IF(@Rec_Mod
= 'FULL')
Begin
-- Truncate the log by changing
the database recovery model to SIMPLE.
SET @SQL = 'ALTER DATABASE '+Quotename(Convert(VARCHAR(100),@DBName),'[]')+' SET RECOVERY SIMPLE WITH
NO_WAIT '
Print (@SQL)
--Exec (@SQL)
Print ('Go')
End
SET @SQL = 'Insert Into
dbo.DB_Shrinking_Log(DatabaseName,Used_SizeMB,FreeSpace_SizeMB)
Select '+Quotename(@DBName,'''')+' ,(Convert(Bigint,size)*8)/1024
,((Convert(Bigint,max_size)*8)/1024)-((Convert(Bigint,size)*8)/1024)
FROM '+Quotename(@DBName,'[]')+'.sys.database_files
Where type_desc = ''LOG'''
--Print (@SQL)
-- Shrink the truncated log
file to 0 MB.
SET @SQL = 'DBCC SHRINKFILE ('+Quotename(Convert(VARCHAR(100),@DB_FileName),'[]')+', 0)'
Print (@SQL)
--Exec (@SQL)
Print ('Go')
IF(@Rec_Mod
= 'FULL')
Begin
-- Reset the database recovery
model.
SET @SQL = 'ALTER DATABASE '+Quotename(Convert(VARCHAR(100),@DBName),'[]')+' SET RECOVERY FULL WITH
NO_WAIT '
Print (@SQL)
--Exec (@SQL)
Print ('Go')
End
Fetch next
from CHANGE_Recovery_CURSOR INTO @DBName,@Rec_Mod
END
CLOSE
CHANGE_Recovery_CURSOR
DEALLOCATE
CHANGE_Recovery_CURSOR
Print 'XP_Fixeddrives'
Print ('Go')
Index Rebuild All databases
Create Proc IndexRebuild_All_DB
As
SET NOCOUNT ON
DECLARE @Database VARCHAR(255)
DECLARE @Table VARCHAR(255),@Table_Short
VARCHAR(255)
DECLARE @cmd NVARCHAR(4000)
DECLARE
@fillfactor INT ,@bit
Bit
--DECLARE
@Avg_Frag Float
SET
@fillfactor = 90
DECLARE
DatabaseCursor CURSOR FOR
SELECT [name] FROM sys.databases
Where
user_access = 0
And [state] =
0
And
database_id >= 5
And [Name] Not In('ReportServer$SQL','ReportServer$SQLTempDB','distribution')
--And [Name]
in('test_sonora')
ORDER BY 1
--=============================
-- Temp table
for logging
--=============================
IF OBJECT_ID('tempdb.dbo.#ObjDetails')
IS NOT NULL
DROP TABLE
#ObjDetails
CREATE TABLE #ObjDetails (
Rowid Int Identity(1,1),
DBName Varchar(200),
Table_Name Varchar(200),
Avg_Frag Float,
[Action] Varchar(30),
Dt_Stamp Datetime Default(Getdate())
)
OPEN
DatabaseCursor
FETCH NEXT FROM
DatabaseCursor INTO @Database
WHILE @@FETCH_STATUS =
0
BEGIN
Print 'DB
Name ==>'+DB_Name(DB_ID(@Database))
SET @cmd = 'Insert Into
Table_Fragment_Before(database_id,object_id,avg_fragmentation_in_percent) '+CHAR(10)
SET @cmd = @cmd + ' Select database_id,NULL,NULL FROM SYS.DM_DB_INDEX_PHYSICAL_STATS
(DB_ID(' +Quotename(@Database,'''') + ' ),NULL,NULL,NULL,NULL) F
Where Object_Name(object_id)= ' +Quotename(@Table_Short,'''')+CHAR(10)
--Print(@cmd)
Exec (@cmd)
SET
@cmd = ' Insert Into
#ObjDetails(DBName,Table_Name,Avg_Frag,[Action])' +CHAR(10)
SET @cmd = @cmd + ' Values( ''' +@Database + ''', '+Quotename('Start Processing','''')+',0,'''+'DB'+''')'+Char(10)
--Print(@cmd)
Exec (@cmd)
SET @cmd = 'DECLARE TableCursor CURSOR
FOR SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' +
table_name + '']'' as tableName FROM [' + @Database + '].INFORMATION_SCHEMA.TABLES
WHERE table_type = ''BASE TABLE'' '
-- And table_name = ''SONORAREPOSITORY'' '
-- create table
cursor
EXEC (@cmd)
OPEN
TableCursor
FETCH NEXT FROM TableCursor
INTO @Table
WHILE @@FETCH_STATUS =
0
BEGIN
Select @Table_Short = Reverse(Substring(Reverse(@Table),2,CHARINDEX('[',Reverse(@Table),0 )-2))
--Print ('Table Name
==> '+@Table_Short)
SET @cmd = 'Insert Into
Table_Fragment_Before(database_id,object_id,avg_fragmentation_in_percent) '+CHAR(10)
SET @cmd = @cmd + ' Select database_id,object_id,avg_fragmentation_in_percent
FROM SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(' +Quotename(@Database,'''') + ' ),NULL,NULL,NULL,NULL) F Where Object_Name(object_id)= '
+Quotename(@Table_Short,'''')+CHAR(10)
--Print(@cmd)
Exec (@cmd)
-- SQL
2005 or higher command
SET
@cmd = 'Declare @a
bit,@Avg_Frag Float = 0'+CHAR(10)
SET
@cmd = @cmd + 'Select @Avg_Frag = ISNULL(avg_fragmentation_in_percent,0)
FROM SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(' +Quotename(@Database,'''') + ' ),NULL,NULL,NULL,NULL) F Where Object_Name(object_id)= '
+Quotename(@Table_Short,'''')+' And
avg_fragmentation_in_percent > 0'+CHAR(10)
SET
@cmd = @cmd + ' If (@Avg_Frag > 30)'+CHAR(10)
SET
@cmd = @cmd + ' Begin '+CHAR(10)
SET
@cmd = @cmd + ' Print '+'''RB'''+CHAR(10)
SET
@cmd = @cmd +' ALTER INDEX ALL ON ' +
@Table + ' REBUILD WITH
(FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')' +CHAR(10)
SET
@cmd = @cmd + ' Insert Into #ObjDetails(DBName,Table_Name,Avg_Frag,[Action])'
+CHAR(10)
SET @cmd = @cmd + ' SELECT ''' +@Database + ''', Table_Name,@Avg_Frag,'''+'RB'+''' From
INFORMATION_SCHEMA.TABLES Where TABLE_NAME = ' +Quotename(@Table_Short,'''')+CHAR(10)
SET
@cmd = @cmd + ' End '+CHAR(10)
SET
@cmd = @cmd + ' Else If (@Avg_Frag Between 1 And 30)'+CHAR(10)
SET
@cmd = @cmd + ' Begin '+CHAR(10)
SET
@cmd = @cmd + ' Print '+'''RO'''+CHAR(10)
SET
@cmd = @cmd +' ALTER INDEX ALL ON ' +
@Table + ' REORGANIZE '
+CHAR(10)
SET
@cmd = @cmd + ' Insert Into
#ObjDetails(DBName,Table_Name,Avg_Frag,[Action])' +CHAR(10)
SET @cmd = @cmd + ' SELECT ''' +@Database + ''', Table_Name,@Avg_Frag,'''+'RO'+''' From
INFORMATION_SCHEMA.TABLES Where TABLE_NAME = ' +Quotename(@Table_Short,'''')+Char(10)
SET
@cmd = @cmd + ' End '+CHAR(10)
SET
@cmd = @cmd + ' Else '+CHAR(10)
SET
@cmd = @cmd + ' Begin '+CHAR(10)
SET
@cmd = @cmd + ' Set @a = 100'+CHAR(10)
-- SET @cmd
= @cmd + ' Print '+'''N/A'''+CHAR(10)
SET
@cmd = @cmd + ' End '+CHAR(10)
-- Print(@cmd)
Exec (@cmd)
FETCH NEXT FROM TableCursor
INTO @Table
END
CLOSE
TableCursor
DEALLOCATE
TableCursor
FETCH NEXT FROM
DatabaseCursor INTO @Database
END
CLOSE
DatabaseCursor
DEALLOCATE
DatabaseCursor
Select * from #ObjDetails
Drop table #ObjDetails
/*
Create Table
Table_Fragment_Before
(
database_id Int,
object_id
Bigint,
avg_fragmentation_in_percent
Float,
DateTimeStamp
Datetime Default(Getdate())
)
Create Table
Table_Fragment_After
(
database_id Int,
object_id Bigint,
avg_fragmentation_in_percent
Float,
DateTimeStamp
Datetime Default(Getdate())
)
*/
CPU Utilization
/*
Create Table
CPU_Utilization
(
row_num int
,
DatabaseName Varchar(255),
CPU_Time_Ms Bigint,
CPUPercent DECIMAL(5,2),
[Timestamp] Datetime
)
*/
/*******************
#2 **********************/
WITH DB_CPU_Stats
AS (
SELECT
DatabaseID
,
DB_NAME(DatabaseID) AS [DatabaseName]
,
SUM(total_worker_time) AS [CPU_Time_Ms]
FROM
sys.dm_exec_query_stats
AS qs
CROSS
APPLY (
SELECT
CONVERT(INT , value) AS [DatabaseID]
FROM
sys.dm_exec_plan_attributes(qs.plan_handle)
WHERE
attribute = N'dbid'
) AS F_DB
GROUP
BY
DatabaseID
)
SELECT
ROW_NUMBER() OVER ( ORDER BY [CPU_Time_Ms] DESC
) AS [row_num]
,
DatabaseName
,
[CPU_Time_Ms]
, CAST([CPU_Time_Ms]
* 1.0 / SUM([CPU_Time_Ms]) OVER ( ) * 100.0 AS DECIMAL(5 , 2)) AS [CPUPercent]
Into
#CPU_Ut
FROM
DB_CPU_Stats
WHERE
DatabaseID >
4 -- system databases
AND
DatabaseID <> 32767 -- ResourceDB
ORDER BY row_num
Declare @Timestamp
Datetime
Select @Timestamp
= GETDATE()
Insert Into dbo.CPU_Utilization(row_num,DatabaseName,CPU_Time_Ms,CPUPercent,Timestamp)
Select row_num,DatabaseName,CPU_Time_Ms,CPUPercent,@Timestamp from
#CPU_Ut
Drop Table #CPU_Ut
Select * from Test.dbo.CPU_Utilization
Table comparison
Select ISNULL(B.COLUMN_NAME,'') As Std_Columns , ISNULL(A.COLUMN_NAME,'') As MAIN_Col ,
Case when B.COLUMN_NAME = A.COLUMN_NAME Then 'MATCHED'
when B.COLUMN_NAME IS NULL AND A.COLUMN_NAME
IS NOT NULL Then 'NEW COLUMN ADDED IN MAIN'
when B.COLUMN_NAME IS NOT NULL AND A.COLUMN_NAME IS NULL Then 'COLUMN EXISTS IN STANDARD COLUMNS BUT NOT IN MAIN TABLE'
ELSE '' END AS REMARKS
INTO #TEMP
from
(
Select
COLUMN_NAME from DB1.INFORMATION_SCHEMA.COLUMNS Where
TABLE_NAME = 'Main_2012_2013'
)A
Full Join
(
Select
COLUMN_NAME from DB2.INFORMATION_SCHEMA.COLUMNS Where
TABLE_NAME = 'Main'
)B
On A.COLUMN_NAME = B.COLUMN_NAME
Select Remarks,COUNT(1) As ColumnCount from
#TEMP
Group By Remarks
List of files with directory name and creation date
Create Proc [dbo].[FileList_SP_Size]
(
@DirPath NVarchar(255)
)
As
--Declare
@DirPath NVarchar(255)
--Set
@DirPath =
'D:\Data_Consolidation\Source_Files\FederalMougal\VOU_40\Proceed\'
Declare @SQL Nvarchar(255)
Create table #tmp
(
Txt nvarchar(500),
Dir nvarchar(500),
[FileSize] nvarchar(100)
)
Set @SQL = 'Dir/aa/s/p '+CONVERT(NVarchar(255),@DirPath)+'*.*'
Insert Into #tmp(Txt)
Exec Xp_cmdshell @SQL --'Dir/aa/s/p
'+CONVERT(NVarchar(255),@DirPath)+'*.*'
Print(@SQL)
Alter Table #tmp Add
[Date1] nvarchar(50)
Delete from #tmp
Where txt is null
--OR txt Like '
Directory%'
OR txt Like '%file%bytes%'
OR txt Like '%Volume%ser%'
OR txt Like 'Volume%in%'
OR txt = '%bytes%free%'
OR Ltrim(txt) = ''
Update #tmp
Set txt = Ltrim(Rtrim(SUBSTRING(txt,40,200))),
[FileSize]= Replace(Ltrim(Rtrim(SUBSTRING(txt,25,15))),',',''),
[Date1] = Left(txt,20)
Where txt not Like ' Directory%'
Delete from #tmp
Where txt is null
OR txt = '%bytes%free%'
OR Ltrim(txt) = ''
Alter Table #tmp Add Rowid int IDENTITY(1,1)
Update #Tmp Set Dir = Txt
Where txt Like ' Directory%'
Declare @Rowid int ,@Txt Nvarchar(255),@Dir Nvarchar(255)
Declare
File_CURSOR Cursor for
Select Rowid,Txt,Dir from #tmp Where txt Like ' Directory%' Order By Rowid Desc
open
File_CURSOR
Fetch next from File_CURSOR
INTO @Rowid ,@Txt
,@Dir
while @@Fetch_Status=0
BEGIN
Update #Tmp Set Dir = @Dir
Where Rowid >= @Rowid
And Dir is null
Fetch next
from File_CURSOR INTO
@Rowid ,@Txt ,@Dir
END
CLOSE
File_CURSOR
DEALLOCATE
File_CURSOR
Update #Tmp Set Dir = Replace(Dir,' Directory of','')
Select Rowid, Txt As [File name],Dir As [Directory
Name] , [FileSize],[Date1] from #Tmp
Where Txt Not Like 'bytes%free%'
And Date1 is not null
SPLIT Function
--Select * from
dbo.Split('aa,bb,cc,dd,ee,ff,ggg',',')
Create FUNCTION [dbo].[Split]
(
@List Nvarchar(4000),
@SplitOn nvarchar(5)
)
RETURNS @RtnValue table
(
Id int identity(1,1),
Value nvarchar(4000)
)
AS
BEGIN
While (Charindex(@SplitOn,@List)>0)
Begin
Insert Into @RtnValue (value)
Select Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))
Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
End
Insert Into
@RtnValue (Value)
Select Value = ltrim(rtrim(@List))
Return
END
Remove Multiple Space into single space
-- =============================================
-- Author: <Shagaf Khot>
-- Description:
Remove space from string
--
=============================================
--Select
[dbo].[Remove_spaces]('abc def
gh ij')
CREATE FUNCTION [dbo].[Remove_spaces](@str Nvarchar(4000))
RETURNS Nvarchar(4000)
AS
BEGIN
WHILE CHARINDEX(Space(2), @str) > 0
SET @str = REPLACE(@str, Space(2), Space(1))
RETURN Ltrim(Rtrim(@str))
END
GO
Remove New line char Multiple Space from String
IF EXISTS(Select 1 from sysobjects where [type] = 'FN' And name = 'Remove_CR_TAB_Space')
Drop FUNCTION
Remove_CR_TAB_Space
Go
--
=============================================
-- Author: <Shagaf Khot>
-- Description:
Remove New Line Char and multiple spaces from string
--
=============================================
CREATE FUNCTION Remove_CR_TAB_Space(@str
Nvarchar(4000))
RETURNS Nvarchar(4000)
AS
BEGIN
Declare @CR NVarchar(10),@TAB NVarchar(10)
Set @CR = Char(13)+Char(10)
Set @TAB = Char(9)
WHILE CHARINDEX(@CR, @str) > 0
SET @str = REPLACE(@str, @CR, ' ')
WHILE CHARINDEX(@TAB, @str) > 0
SET @str = REPLACE(@str, @TAB, ' ')
WHILE CHARINDEX(Space(2), @str) > 0
SET @str = REPLACE(@str, Space(2), Space(1))
RETURN Ltrim(Rtrim(@str))
END
Go
Remove special characters from String
---- SP Detail :
Remove special characters from String
----
======================================================================
-- select
dbo.RemoveSpecialChars('abc-123+ABC
& nbu %^%(^$%$#(*)(')
Create function [dbo].[RemoveSpecialChars] (@s varchar(256)) returns varchar(256)
with schemabinding
begin
if @s is null
return null
declare @s2 varchar(256)
set @s2 = ''
declare @l int
set @l = len(@s)
declare @p int
set @p = 1
while @p <= @l begin
declare
@c int
set @c = ascii(substring(@s, @p, 1))
if @c = 38 or @c between 48 and 57 or @c between 65 and 90 or @c between 97 and 122
set
@s2 = @s2 + char(@c)
set @p = @p + 1
end
if len(@s2) = 0
return null
return @s2
end
Fetch String Data Only
-- Function
Detail : Function to fetch the string data only
--
======================================================================
-- SELECT
dbo.UFNG_ONLY_STRING('8asdf7%87^A8876-*S')
CREATE FUNCTION [dbo].[UFNG_ONLY_STRING] (@StrVal AS VARCHAR(max))
RETURNS VARCHAR(max)
AS
BEGIN
WHILE PATINDEX('%[^A-z]%', @StrVal) > 0
SET
@StrVal = REPLACE(@StrVal,
SUBSTRING(@StrVal,PATINDEX('%[^A-z]%', @StrVal),1),'')
RETURN
@StrVal
END
Fetch Digits Only
-- SELECT
dbo.UFNG_ONLY_DIGITS('8asdf7%87^A8876-*S')
CREATE FUNCTION [dbo].[UFNG_ONLY_DIGITS] (@StrVal AS VARCHAR(max))
RETURNS VARCHAR(max)
AS
BEGIN
WHILE PATINDEX('%[^0-9]%', @StrVal) > 0
SET
@StrVal = REPLACE(@StrVal,
SUBSTRING(@StrVal,PATINDEX('%[^0-9]%', @StrVal),1),'')
RETURN
@StrVal
END
GO
Word Count Function
CREATE FUNCTION [dbo].[WordCount] ( @InputString VARCHAR(4000) )
RETURNS INT
AS
BEGIN
DECLARE
@Index INT
DECLARE @Char CHAR(1)
DECLARE
@PrevChar CHAR(1)
DECLARE
@WordCount INT
SET @Index = 1
SET @WordCount
= 0
WHILE @Index <= LEN(@InputString)
BEGIN
SET
@Char =
SUBSTRING(@InputString, @Index, 1)
SET
@PrevChar = CASE
WHEN @Index = 1
THEN ' '
ELSE SUBSTRING(@InputString, @Index
- 1, 1)
END
IF
@PrevChar = ' ' AND @Char != ' '
SET
@WordCount = @WordCount + 1
SET @Index = @Index + 1
END
RETURN @WordCount
END
GO
SP_ExecuteSQL Example
DECLARE
@ParmDefinition nvarchar(500),@Filename nvarchar(500)
Declare @SQLString
NVarchar(MAX)
SET
@ParmDefinition = N'@Filename_2
NVARCHAR(500) OUTPUT'
Set @SQLString
= N'
Set @Filename_2 =
''D:\HQ\HQ_Q4_File_Sample.xlsx''
';
Print(@SQLString)
EXECUTE sp_executesql @SQLString,@ParmDefinition,@Filename_2
= @Filename OUTPUT
Select @Filename
SP_ MSforeachtable Example
SELECT *
FROM information_schema.routines ISR
WHERE CHARINDEX('dbo.First', ISR.ROUTINE_DEFINITION) > 0
GO
-- Method 3: Using
DMV sys.dm_sql_referencing_entities
SELECT
referencing_schema_name,
referencing_entity_name,
referencing_id, referencing_class_desc,
is_caller_dependent
FROM sys.dm_sql_referencing_entities
('dbo.TEST_TBL', 'OBJECT');
GO
Select * FROM sys.dm_sql_referencing_entities('dbo.TEST_TBL', 'OBJECT');
INSERT INTO #TableSpaceUsed
EXEC sys.sp_MSforeachtable 'sp_spaceused ''?''';
Create Table #DependentObj
(
TableName NVarchar(255),
referencing_entity_name NVarchar(255)
)
Insert Into #DependentObj(TableName,referencing_entity_name)
EXEC sys.sp_MSforeachtable 'Select ''?'' As TableName,referencing_entity_name FROM
sys.dm_sql_referencing_entities(''?'', ''OBJECT'')'
Select * from #DependentObj
Where TableName not Like '%Error%'
No comments:
Post a Comment