IT-Wissen/t-sql/README.md
Roger Rutishauser 521b772188 add limit
2025-02-28 10:48:15 +01:00

4.8 KiB

Table of Contents

Transact-SQL

begin transaction

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

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:

-- 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

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

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

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
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;