2009-07-24 7 views
0

Sorry, aber ich bin neu in TSQL, so dass ich nicht einmal grundlegende Dinge wissen. Ich habe an dieser Funktion gearbeitet, aber ich habe eine Menge Syntaxprobleme bekommen. Wenn jemand mir beim Schreiben dieser Funktion behilflich sein kann, würde ich es begrüßen.Wie schreibe ich eine TSQL-Funktion, die einen Tabellennamen zum Ablegen und löscht eine Tabelle


1. Ich würde es für die Existenz einer Tabelle überprüfen möchten, bevor Sie die Tabelle
2. ich möchte fallen auf Fehler zu überprüfen, nachdem die Drop-Aktion
3. Durchführung ich es möchte um Statusmeldungen auszudrucken, die den Namen der Tabelle enthalten
4. Ich weiß, dass ich "Keine Aktion benötigt" ausdrucken muss, aber ich schließe es trotzdem ein, um die Aufgabe etwas schwieriger zu machen.
5. Ich habe in eine Menge von Syntaxfehler Probleme laufen, die ich weiß nicht, wie

CREATE FUNCTION SAFE_DROP_TABLE(@TableName NVARCHAR(30)) 
AS 
BEGIN 
    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@TableName) AND TYPE IN (N'U'))   
     DROP TABLE @TableName 
     IF @@ERROR <> 0 
     BEGIN 
      PRINT 'Failed to drop ' + @TableName + ' Error = ' + @@ERROR 
     END ELSE BEGIN 
      PRINT 'dropped' + @TableName 
     END 
    ELSE 
     PRINT 'NO ACTION NEEDED' 
    END 
END 

Tor zum aufzuräumen: Um TSQL so gut wie möglich, so schnell wie möglich zu lernen. Ich muss so viel SQL wie möglich sehen und schreiben. Ich schätze jeden, der sich die Zeit nimmt zu antworten.

Antwort

3

Sie können eine Tabelle nicht mit einer Funktion löschen: Sie müssen es in einem gespeicherten Prozess tun. (Funktionen können die Datenbank nicht ändern.) Etwas wie:

CREATE PROCEDURE SAFE_DROP_TABLE(@TableName nvarchar(30)) 
AS 
BEGIN 

    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@TableName) 
    AND TYPE IN (N'U'))    
     EXEC ('DROP TABLE ' + @TableName) -- note change here 
     IF @@ERROR <> 0 
     BEGIN 
      PRINT 'Failed to drop ' + @TableName + ' Error = ' + @@ERROR 
     END ELSE BEGIN 
      PRINT 'dropped' + @TableName 
     END 
    ELSE 
     PRINT 'NO ACTION NEEDED' 
    END 

END 
+0

EXEC ('DROP TABLE' QUOTENAME (@TableName)) - Behandelt alle Tabellennamen und schützt vor SQL-Injection- –

2

Sie müssten dazu EXEC verwenden.

Auf der Linie, die DROP TABLE sagt, würden Sie tun:

EXEC ('DROP TABLE' + @TableName)

ABER, ich nicht tun dies sehr empfehlen. Jeder könnte einen beliebigen Tabellennamen (oder ein anderes gültiges SQL in @TableName (SQL Injection genannt) eingeben und alle Arten von Problemen verursachen.

Ich würde etwas Datenbank-Theorie lesen, bevor ich zu tief in den Versuch zu lernen T-SQL-Syntax

SQL-Injection-Information:..
http://unixwiz.net/techtips/sql-injection.html
http://en.wikipedia.org/wiki/SQL_injection
http://msdn.microsoft.com/en-us/library/ms161953.aspx

+0

Nur wenn er den Proc mit Benutzereingabe aufruft - was definitiv nicht ratsam ist. –

+0

Angenommen, Sie müssen 10 Tabellen löschen. muss ich die Drop-Logik 10 Mal kopieren und einfügen? Fallen 10 Tische auf ein Szenario, das in realen Situationen nie passiert? – MedicineMan

+0

Es ist ziemlich selten, dass Sie Tabellen als Teil Ihrer Geschäftslogik fallen lassen würden. Tische neigen dazu, für eine lange Zeit zu bleiben. –

Verwandte Themen