2016-08-08 22 views
0

Ich habe ein Problem, wo ich Tabellen auf Grundlage der Anzahl der Parameter in der gespeicherten Prozedur übergeben erstellen muß wie folgt durchführen:eine effiziente Art und Weise benötigen die angegebene SQL-Abfrage in SQL Server, gespeicherte Prozedur

----when there is one column 
'CREATE TABLE [dbo].['[email protected]_name+'] (
        ['[email protected]+'] [VARCHAR](200) 
       ) ' 
----when there are two column      
'CREATE TABLE [dbo].['[email protected]_name+'] (
     ['[email protected]+'] [VARCHAR](200), 
     ['[email protected]+'] [VARCHAR](200) 
       ) ;' 

----when there are three column    
'CREATE TABLE [dbo].['[email protected]_name+'] (
        ['[email protected]+'] [VARCHAR](200), 
        ['[email protected]+'] [VARCHAR](200), 
        ['[email protected]+'] [VARCHAR](200) 
       ) ' 

Eine Möglichkeit, die ich kenne, dies zu tun ist:

----when there is one column 
If ((@colname1 IS NOT NULL AND LEN(@colname1) !=0)) 
BEGIN 
'CREATE TABLE [dbo].['[email protected]_name+'] (
        ['[email protected]+'] [VARCHAR](200) 

       )' 
END 
----when there are two column      
If ((@colname1 IS NOT NULL AND LEN(@colname1) !=0) 
AND (@colname2 IS NOT NULL AND LEN(@colname2) !=0)) 
BEGIN 
Drop table [dbo].['[email protected]_name+'] 
'CREATE TABLE [dbo].['[email protected]_name+'] (
        ['[email protected]+'] [VARCHAR](200), 
        ['[email protected]+'] [VARCHAR](200) 
       )' 
END     
----when there are three column    
If ((@colname1 IS NOT NULL AND LEN(@colname1) !=0) 
AND (@colname2 IS NOT NULL AND LEN(@colname2) !=0) 
AND (@colname3 IS NOT NULL AND LEN(@colname3) !=0)) 
BEGIN 
Drop table [dbo].['[email protected]_name+'] 
'CREATE TABLE [dbo].['[email protected]_name+'] (
        ['[email protected]+'] [VARCHAR](200), 
        ['[email protected]+'] [VARCHAR](200), 
        ['[email protected]+'] [VARCHAR](200) 
       ) ' 
END 

Durch die Nutzung dieser Art und Weise, mein Code sehr lang wird. Gibt es einen anderen effizienten Weg, dies zu tun? Wenn ich Werte für @ colname1, @ colname2, @ colname3 getrennt übergebe, übergebe ich Werte in einem einzigen Parmaeter @colname als @colname = 'col1, col2, col3', wie kann ich das tun?

+1

Dies ist wahrscheinlich eine schlechte Idee zu beginnen. Erstellen Sie Datenbankobjekte wie Tabellen in Entwurfszeit, nicht in Laufzeit. –

+0

Was versuchen Sie eigentlich zu erreichen? Vielleicht gibt es einen besseren Weg, der nicht die dynamische Erstellung von Tabellen beinhaltet. –

+0

Sie können immer mit einer Spalte beginnen und anschließend "alter table add column" -Anweisungen bedingt ausführen. – Jeremy

Antwort

1

Es ist möglich, dynamic sql und einen durch Kommas getrennten Parameter für Spaltennamen zu verwenden, obwohl das, wie ich in meinem Kommentar geschrieben habe, eine schlechte Idee ist, und ich empfehle dringend, diesen Ansatz zu überdenken. die "xml geteilt String-Technik" und QUOTENAME mit SQL-Injection Gefahr zu minimieren:

CREATE PROCEDURE stpCreateTableDynamically 
(
    @Table_Name sysname, 
    @Column_Names nvarchar(max) 
) 

AS 

    DECLARE @Sql nvarchar(max) 

    SELECT @Sql = 'CREATE TABLE [dbo].' + QUOTENAME('zzz_'+ @Table_Name) +' (' 

    SELECT @Sql = @Sql + QUOTENAME(split.a.value('.', 'VARCHAR(100)')) + ' [VARCHAR](200),' 
    FROM (SELECT Cast ('<M>' + Replace(@Column_Names, ',', '</M><M>')+ '</M>' AS XML) AS Data) AS A 
      CROSS apply data.nodes ('/M') AS Split(a); 

    SELECT @Sql = LEFT(@Sql, LEN(@Sql) - 1) + ') ON [ZZZ_FG];' 

    PRINT @Sql 
    --EXEC(@Sql) 

GO 

Verbrauch:

EXEC stpCreateTableDynamically 'MyTable', 'Column1,Col2,Col3' 

Ausgang:

CREATE TABLE [dbo].[zzz_MyTable] ([Column1] [VARCHAR](200),[Col2] [VARCHAR](200),[Col3] [VARCHAR](200)) ON [ZZZ_FG]; 

Sobald Sie sehen, dass die Ausgabe in Ordnung ist , können Sie die Zeile exec unmarkieren und die Zeile print löschen.

+0

Beide die angegangen gearbeitet. Danke, – cnayak

+0

Nun, in diesem Fall, wählen Sie die Antwort, die Sie beschlossen haben zu gehen und markieren Sie es als akzeptiert, so dass andere Leute wissen, dass das Problem gelöst ist. –

1

Sie können wie diese versuchen,

DECLARE @SQL NVARCHAR(max) = '' 
    ,@table_name NVARCHAR(255) = 'Table1' 
    ,@colname1 NVARCHAR(255) = 'c1' 
    ,@colname2 NVARCHAR(255) = 'c2' 
    ,@colname3 NVARCHAR(255) = 'c3' 
    ,@cols NVARCHAR(max) = '' 

SET @cols = CASE 
     WHEN @colname1 IS NOT NULL 
      AND len(@colname1) > 0 
      THEN ',[' + @colname1 + '] [VARCHAR](200)' 
     ELSE '' 
     END + CASE 
     WHEN @colname2 IS NOT NULL 
      AND len(@colname2) > 0 
      THEN ',[' + @colname2 + '] [VARCHAR](200)' 
     ELSE '' 
     END + CASE 
     WHEN @colname3 IS NOT NULL 
      AND len(@colname3) > 0 
      THEN ',[' + @colname3 + '] [VARCHAR](200)' 
     ELSE '' 
     END 
SET @cols = stuff(@cols, 1, 1, '') 
SET @SQL = 'Drop table [dbo].[zzz_' + @table_name + '] 
CREATE TABLE [dbo].[zzz_' + @table_name + '] (
' + @cols + ' 
) ON [ZZZ_FG];' 

PRINT @sql 
    --EXEC sp_executesql @sql