2016-06-14 16 views
-2

Ich versuche diese Abfrage, aber es funktioniert nicht.Wie Spalte dynamisch in SQL Server mithilfe gespeicherter Prozeduren einfügen?

CREATE PROCEDURE USP_UPDATEUSERS_0 
    @COLUMNNAME NVARCHAR(30), 
    @DATATYPE NVARCHAR(30) 
AS 
    ALTER TABLE HC_USER_MAIN 
     ADD COLUMNNAME = @COLUMNNAME DATATYPE = @DATATYPE 

aber ich bekomme diese Fehlermeldung:

Msg 102, Level 15, State 1, Procedure USP_UPDATEUSERS_0, Line 1
Incorrect syntax near '='.

+5

Haben Sie sehen die Syntax zum Hinzufügen einer Spalte? – HoneyBadger

+5

Dies hat "Bad Design" überall geschrieben. Warum möchten Sie, dass eine gespeicherte Prozedur überhaupt DDL-Anweisungen ausführt? –

+2

Warum sich überhaupt mit einer Prozedur beschäftigen. Ich sehe nicht, wie die Ausführung von 'EXECUTE USP_UPDATEUSERS_0 'NewColumn', 'VARCHAR (50)', ist bequemer als 'ALTER TABLE HC_USER_MAIN ADD NewColumn VARCHAR (50)' – GarethD

Antwort

0

Sie können es mit Hilfe von dynamischen SQL machen (und eine bessere Nutzung sysname für diese):

CREATE PROCEDURE USP_UPDATEUSERS_0 
    @COLUMNNAME sysname, 
    @DATATYPE sysname 
AS 
DECLARE @sql nvarchar(max) 
--To check if column with that name not exists 
IF NOT EXISTS(
SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.columns 
WHERE TABLE_NAME = 'HC_USER_MAIN' and COLUMN_NAME = @COLUMNNAME) 
--If not exists then add new column 
SELECT @sql = 'ALTER TABLE HC_USER_MAIN ADD ' + QUOTENAME(@COLUMNNAME) + ' ' + @DATATYPE 
EXEC sp_executesql @sql 
+4

Nicht, dass ich der Antwort zustimme, aber Sie sollten mindestens 'QUOTENAME' verwenden, anstatt einfach Klammern zu verketten, es würde korrekt den Spaltennamen verlassen, wenn jemand etwas wie 'Test] INT sendet; DROP TABLE HC_USER_MAIN; - '. – GarethD

+0

Nur an diesen Äther gedacht. – gofr1

+0

Also, hilft meine Antwort Ihnen? Hast du es überprüft? – gofr1

Verwandte Themen