2016-08-08 3 views
0

が必要:は、私は、ストアドプロシージャに渡されたパラメータの数に基づいてテーブルを作成する必要があり、私は問題を抱えているSQL Serverで指定されたSQLクエリを実行するための効率的な方法、ストアドプロシージャ

----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) 
       ) ' 

私はこれを行うの知っている一つの方法は次のとおりです。

----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 

この方法を使用することにより、私のコードは非常に長くなります。これを行う他の効率的な方法はありますか? @ colname1、@ colname2、@ colname3の値を別々に渡すのではなく、@colname = 'col1、col2、col3'のように@colnameという単一のパラメーターに値を渡します。どうすればいいですか?

+1

を試すことができます。実行時ではなく、設計時にテーブルなどのデータベースオブジェクトを作成します。 –

+0

実際に何を達成しようとしていますか?テーブルを動的に作成することを伴わないより良い方法があるかもしれません。 –

+0

いつでも1つの列から開始し、条件付きで "alter table add column"文を実行できます。 – Jeremy

答えて

1

カラム名には動的SQLとカンマ区切りのパラメータを使用できますが、私のコメントで書いたように、これは悪い考えです。このアプローチを再考することを強くお勧めします。 SQLインジェクションの危険性を最小限に抑えるために、 "XML分割文字列の技術" とQUOTENAMEを使用して :

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 

使用法:

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

出力:

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

あなたは出力がOKであることを確認したら、 exec行をアンリマークし、print行を削除することができます。

+0

どちらも近づいています。ありがとうございました – cnayak

+0

その場合は、問題が解決されたことを他の人が知るように、あなたが決めた回答を選択し、それを受け入れたものとしてマークしてください。 –

1

あなたは、これはおそらく、そもそも悪い考えで、このよう

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 
関連する問題