USE PUBS GO SET NOCOUNT ON CREATE TABLE #TableSpace ( Name char(20) ,RowCnt int ,Reserved varchar(15) ,Data varchar(15) ,Index_Size varchar(15) ,Unused varchar(15) ) DECLARE @Table sysname DECLARE TableCur CURSOR FOR SELECT Table_Name FROM INFORMATION_SCHEMA.Tables WHERE Table_Type = 'BASE TABLE' AND OBJECTPROPERTY(OBJECT_ID(Table_Name),'IsMSShipped') = 0 OPEN TableCur FETCH NEXT FROM TableCur INTO @Table WHILE @@FETCH_STATUS = 0 BEGIN INSERT #TableSpace EXEC sp_spaceused @Table FETCH NEXT FROM TableCur INTO @Table END CLOSE TableCur DEALLOCATE TableCur SELECT * FROM #TableSpace DROP TABLE #TableSpace SET NOCOUNT OFF Name RowCnt Reserved Data Index_Size Unused -------------------- ----------- --------------- --------------- --------------- --------------- __tmpTBLCOL 131 80 KB 16 KB 8 KB 56 KB authors 23 40 KB 8 KB 32 KB 0 KB discounts 3 16 KB 8 KB 8 KB 0 KB dup_authors 40 80 KB 16 KB 8 KB 56 KB employee 43 40 KB 8 KB 32 KB 0 KB jobs 14 24 KB 8 KB 16 KB 0 KB max_t 4 16 KB 8 KB 8 KB 0 KB median 8 16 KB 8 KB 8 KB 0 KB pub_info 8 160 KB 120 KB 16 KB 24 KB publishers 8 24 KB 8 KB 16 KB 0 KB roysched 86 32 KB 8 KB 24 KB 0 KB sales 21 56 KB 8 KB 48 KB 0 KB silly_one 0 0 KB 0 KB 0 KB 0 KB stores 6 24 KB 8 KB 16 KB 0 KB tableCounts 15 16 KB 8 KB 8 KB 0 KB titleauthor 25 56 KB 8 KB 48 KB 0 KB titles 18 40 KB 8 KB 32 KB 0 KB Trace_Table_Name 0 0 KB 0 KB 0 KB 0 KB vals 127 24 KB 8 KB 16 KB 0 KB x 2 16 KB 8 KB 8 KB 0 KB
Danke an Jonathan van Houtte für das Originalskript.
Um sicherzustellen, dass RowCnt aktuell ist, sollte man vorher
DBCC UPDATEUSAGE(0) WITH COUNT_ROWS
ausführen.
CREATE FUNCTION dbo.fakultät(@n DECIMAL(38,0))
RETURNS DECIMAL(38,0)
AS
BEGIN
DECLARE @tmp DECIMAL(38,0)
IF (@n <= 1)
SELECT @tmp = 1
ELSE
SELECT @tmp = @n * dbo.fakultät(@n - 1)
RETURN @tmp
END
GO
SELECT dbo.fakultät(10)
DROP FUNCTION dbo.fakultät
----------------------------------------
3628800
(1 row(s) affected)
Spielt man dieses Spielchen weiter, wird man feststellen, dass man bei Zahlen grösser als 32, folgende Meldung erhält:
Server: Nachr.-Nr. 217, Schweregrad 16, Status 1, Prozedur fakultät, Zeile 9
Die maximale Schachtelungsebene für .... (Limit ist 32).
Man wird auch feststellen, dass bei Input von 32 eine Abweichung zu Excel existiert.
DECLARE @x1 FLOAT
DECLARE @x2 FLOAT
DECLARE @y1 FLOAT
DECLARE @y2 FLOAT
SELECT @x1 = 1, @x2 = 2, @y1 = 1, @y2 = 2
SELECT (@y2-@y1)/(@x2-@x1)
-----------------------------------------------------
1.0
(1 row(s) affected)
Oder als UDF
CREATE FUNCTION dbo.steigung(@y1 FLOAT,@y2 FLOAT, @x1 FLOAT, @x2 FLOAT)
RETURNS FLOAT
AS
BEGIN
RETURN (@y2-@y1)/(@x2-@x1)
END
GO
SELECT dbo.steigung(1,2,1,2)
DROP FUNCTION dbo.steigung
-----------------------------------------------------
1.0
(1 row(s) affected)
Sozusagen als krönender Abschluss meines Exkurses in die Statistik, hier ein Skript zur Berechnung des hyperbolischen Tangens:
DECLARE @sinhyp FLOAT
DECLARE @coshyp FLOAT
SELECT @sinhyp=0.5, @coshyp=0.5
SELECT
((POWER(EXP(1),@sinhyp) - POWER(EXP(1),-@sinhyp) )/2) /
(( POWER(EXP(1),@coshyp) + POWER(EXP(1),-@coshyp) )/2)
-----------------------------------------------------
0.46211715726000974
(1 row(s) affected)
Auch dies ist eine Adaption aus Excel. Diesmal die Funktion TANHYP(). Da dies nun ziemlich wild aussieht, empfiehlt sich hier der Einsatz der UDF-Variante, die dann komplett so aussieht:
CREATE FUNCTION dbo.hypsin (@sinhyp FLOAT)
RETURNS FLOAT
AS
BEGIN
RETURN (POWER(EXP(1),@sinhyp) - POWER(EXP(1),-@sinhyp) )/2
END
GO
CREATE FUNCTION dbo.hypcos (@coshyp FLOAT)
RETURNS FLOAT
AS
BEGIN
RETURN ( POWER(EXP(1),@coshyp) + POWER(EXP(1),-@coshyp) )/2
END
GO
CREATE FUNCTION dbo.hyptan (@tanhyp FLOAT)
RETURNS FLOAT
AS
BEGIN
RETURN (dbo.hypsin(@tanhyp)/dbo.hypcos(@tanhyp))
END
GO
SELECT dbo.hyptan(0.5)
DROP FUNCTION dbo.hypsin
DROP FUNCTION dbo.hypcos
DROP FUNCTION dbo.hyptan
-----------------------------------------------------
0.46211715726000974
(1 row(s) affected)