Sql 使用逗号分隔的列名列表创建表的存储过程

Sql 使用逗号分隔的列名列表创建表的存储过程,sql,sql-server-2005,Sql,Sql Server 2005,我正在运行SQLServer2005。 我想创建一个存储过程,该过程将创建一个名为table1的表,并使用传递的逗号分隔值列表,使用该列表中的每个元素作为列名 所以基本上就像sp_程序重命名(col1,col2,col3) 将创建包含col1、col2和col3列的表1 (如果他们都是varchar(max),那也太好了 CREATE PROCEDURE dbo.whatever -- do not use sp_ prefix! @tablename SYSNAME, @column_

我正在运行SQLServer2005。 我想创建一个存储过程,该过程将创建一个名为table1的表,并使用传递的逗号分隔值列表,使用该列表中的每个元素作为列名

所以基本上就像sp_程序重命名(col1,col2,col3)

将创建包含col1、col2和col3列的表1 (如果他们都是varchar(max),那也太好了

CREATE PROCEDURE dbo.whatever -- do not use sp_ prefix!
  @tablename SYSNAME,
  @column_list VARCHAR(MAX)
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @sql NVARCHAR(MAX);

  SET @sql = N'CREATE TABLE dbo.' + QUOTENAME(@tablename) + '
    (
      [' + REPLACE(@column_list, ',', '] VARCHAR(MAX),
      [')
      + '] VARCHAR(MAX)
    );';

  EXEC sp_executesql @sql;
END
GO
这不会做任何错误处理,例如如果
@tablename
已经存在,也不会做任何事情来保护您不受SQL注入的影响。如果用户键入了以逗号分隔的列名列表,请格外小心


哦和。

这些应该是字符串吗?比如
sp_procedurename('table1','col1','col2','col3')
或者
sp_procedurename('col1,col2,col3'))
是的,但是您可以硬编码table1。列表可以只是列名。换句话说,我希望能够为过程提供一个我想要的任何列名的列表,并让它动态地构建一个表。您可以找到数百个使用SQL拆分字符串的实现—有很多方法可以做到这一点,有些方法很简单,比如通过每个字符都有一个字符,还有一些更复杂的算法,但它们都能工作。从这里开始,只需要构建一个动态SQL语句并执行它。安全性应该是一个大问题,因为您对SQL注入非常开放。@Joe我认为您不需要在这里拆分。您如何称呼它?crt_tbl('looper''col1,col2,col3')不起作用。啊,我明白了。crt_-tbl looper,'col1,col2,col3'
EXEC dbo.whatever@tablename=N'looper',@column_list='col1,col2,col3';
crt_-tbl?打字太难了,你需要让你的名字简洁易读(对许多人来说更难打字)只是为了避免元音?伯特兰先生,为了测试的目的,我选择了一个快速的名字。谢谢你的解决方案。