97 lines
2.8 KiB
Markdown
97 lines
2.8 KiB
Markdown
---
|
|
gitea: none
|
|
include_toc: true
|
|
---
|
|
# Transact-SQL
|
|
|
|
## begin transaction
|
|
|
|
``` sql
|
|
begin transaction
|
|
-- ...insert or whatever...
|
|
commit; -- if all ok
|
|
rollback; --if not ok
|
|
```
|
|
|
|
## 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
|
|
```
|
|
|
|
## 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;
|
|
```
|