--- gitea: none include_toc: true --- # Transact-SQL ## begin transaction ``` sql begin transaction -- ...insert or whatever... commit; -- if all ok rollback; --if not ok ``` ## limit ``` ... LIMIT 5 at the end, would become SELECT TOP (5) at the start. ``` ## check memory of DB server ``` SELECT (physical_memory_in_use_kb/1024) AS Memory_usedby_Sqlserver_MB, (locked_page_allocations_kb/1024) AS Locked_pages_used_Sqlserver_MB, (total_virtual_address_space_kb/1024) AS Total_VAS_in_MB, process_physical_memory_low, process_virtual_memory_low FROM sys.dm_os_process_memory; ``` ## Check for orphaned users ``` sql USE [YourDatabaseName]; -- Switch to your target database SELECT dp.name AS OrphanedUser FROM sys.database_principals dp LEFT JOIN sys.server_principals sp ON dp.sid = sp.sid WHERE sp.sid IS NULL AND dp.type IN ('S', 'U') AND dp.name NOT IN ('guest', 'INFORMATION_SCHEMA', 'sys'); ``` ## Check if a List of numbers exist in a table: ``` sql -- declare array DECLARE @IDList TABLE (ID INT); -- fill array INSERT INTO @IDList (ID) VALUES (274), (7238), (7546), (7719), (36227); -- create table with id and exists/not exist SELECT l.ID, CASE WHEN vv.OBJ_ID IS NOT NULL THEN 'Exists' ELSE 'Does Not Exist' END AS Status FROM @IDList l LEFT JOIN VAL vv ON l.ID = vv.OBJ_ID; ``` ## String Suche über alle Tables einer DB ``` sql DECLARE @SearchStr NVARCHAR(100) = '%wikidata%' -- Replace with the string you want to search DECLARE @SQL NVARCHAR(MAX) = '' -- Generate the SQL for each table and column SELECT @SQL = @SQL + 'SELECT ''' + TABLE_SCHEMA + '.' + TABLE_NAME + ''' AS TableName, ''' + COLUMN_NAME + ''' AS ColumnName, ' + 'CAST(' + QUOTENAME(COLUMN_NAME) + ' AS NVARCHAR(4000)) AS ColumnValue ' + 'FROM ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + ' ' + 'WHERE CAST(' + QUOTENAME(COLUMN_NAME) + ' AS NVARCHAR(4000)) LIKE ''%' + @SearchStr + '%'' UNION ALL ' FROM INFORMATION_SCHEMA.COLUMNS WHERE DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'text', 'ntext') -- Remove the last UNION ALL SET @SQL = LEFT(@SQL, LEN(@SQL) - 10) -- Execute the dynamically constructed SQL EXEC sp_executesql @SQL ``` ### String Suche in einem bestimmten Feld über alle DB ```sql DECLARE @SearchStr NVARCHAR(100) = '%sts.%' -- Replace with your search string DECLARE @SQL NVARCHAR(MAX) = '' DECLARE @DatabaseName NVARCHAR(128) -- Cursor to loop through all databases DECLARE db_cursor CURSOR FOR SELECT name FROM sys.databases WHERE state_desc = 'ONLINE' AND name NOT IN ('Hallengreen') -- Optional: Exclude system databases OPEN db_cursor FETCH NEXT FROM db_cursor INTO @DatabaseName WHILE @@FETCH_STATUS = 0 BEGIN -- Create dynamic SQL for each database to search in the dbo.STM table SET @SQL = 'USE ' + QUOTENAME(@DatabaseName) + ';' + CHAR(13) + CHAR(10) + 'IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ''dbo'' AND TABLE_NAME = ''STM'')' + CHAR(13) + CHAR(10) + 'BEGIN' + CHAR(13) + CHAR(10) + ' SELECT *' + CHAR(13) + CHAR(10) + ' FROM dbo.STM' + CHAR(13) + CHAR(10) + ' WHERE STM_VALUE LIKE ''' + @SearchStr + ''';' + CHAR(13) + CHAR(10) + 'END;' + CHAR(13) + CHAR(10) -- Execute the dynamically created SQL EXEC sp_executesql @SQL FETCH NEXT FROM db_cursor INTO @DatabaseName END CLOSE db_cursor DEALLOCATE db_cursor ``` ## convert Unix Timestamp to date ``` sql SELECT pid, dateadd(hh,-5,dateadd(s, convert(bigint, cDate) / 1000, convert(datetime,'1-1-1970 00:00:00'))), dateadd(hh,-5,dateadd(s, convert(bigint, mDate) / 1000, convert(datetime,'1-1-1970 00:00:00'))), mDate, dcTitle FROM databasename_xy.dbo.tablename_xy WHERE pid like 'test:%''; ``` ## Mehrere Zeilen zusammen in 1 Zeile mergen Annahme: - Tabelle hat Spalten OBJ_ID, VAL_TEXT, FLD_ID - OBJ_ID hat mehrere Einträge, mit unterschiedlichen Werten in VAL_TEXT und FLD_ID. Halt je nach Feld andere Feldwerte. - Ich möchte eine Query, die mir 1 Zeile pro OBJ_ID ausgibt, mit 1 Spalte "url" und 1 Spalte "Name" - "url" ist in VAL_TEXT mit FLD_ID xy (in diesem Bsp. egal) enthalten - "name" ist in VAL_TEXT mit FLD_ID 40414 enthalten - Bei der Query soll nur die OBJ_ID berücksichtig werden, die in einem VAL_TEXT "%wikidata%" drin hat ``` sql WITH CTE_Wikidata AS ( -- Sammle alle OBJ_IDs, bei denen VAL_TEXT "wikidata" enthält SELECT OBJ_ID, VAL_TEXT AS url FROM VAL WHERE VAL_TEXT LIKE '%wikidata%' ), CTE_Person AS ( -- Sammle alle OBJ_IDs, bei denen FLD_ID = 240414 und die in CTE_Wikidata existieren SELECT v.OBJ_ID, v.VAL_TEXT AS person FROM VAL v INNER JOIN CTE_Wikidata wd ON v.OBJ_ID = wd.OBJ_ID WHERE v.FLD_ID = 40414 ) SELECT wd.OBJ_ID, wd.url, p.person FROM CTE_Wikidata wd LEFT JOIN CTE_Person p ON wd.OBJ_ID = p.OBJ_ID; ```