Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用我们输入的名称和字段创建表?_Sql_Sql Server 2008 - Fatal编程技术网

Sql 如何使用我们输入的名称和字段创建表?

Sql 如何使用我们输入的名称和字段创建表?,sql,sql-server-2008,Sql,Sql Server 2008,我想创建一个存储过程,用我们在表单中输入的名称和字段创建表。下面是SP,它将为您创建一个动态表。您需要将tablename作为第一个参数传递,并将第二个参数中的列名用tilde`分隔,列名和数据类型用管道分隔| --exec DynamicTables 'table1', 'firstname|varchar(1000)~lastname|varchar(1000)~phoneno|int' Create proc DynamicTables ( @tablename varchar(1

我想创建一个存储过程,用我们在表单中输入的名称和字段创建表。

下面是SP,它将为您创建一个动态表。您需要将tablename作为第一个参数传递,并将第二个参数中的列名用tilde`分隔,列名和数据类型用管道分隔|

--exec DynamicTables 'table1', 'firstname|varchar(1000)~lastname|varchar(1000)~phoneno|int'
Create proc DynamicTables
(
    @tablename varchar(100),
    @fieldsanddatatypes varchar(4000)
)

as

begin

declare @str varchar(4000);
set @str = 'create table ' + @tablename + ' ( ';

select @str = @str + substring(Splvalue, 1,CHARINDEX('|',Splvalue)-1) + ' ' + substring(Splvalue, CHARINDEX('|',Splvalue)+1,len(Splvalue)) + ','
from dbo.FnSplit(@fieldsanddatatypes,'~')

set @str = substring(@str,1,len(@str)-1) + ' )'

exec (@str)

end
在SP中,一个函数拆分列名并创建用于创建表的动态脚本。该函数的代码如下所示

CREATE FUNCTION [dbo].[FnSplit](@text varchar(max), @delimiter Nvarchar(20))  
RETURNS @Strings TABLE  
(       
 Splvalue Nvarchar(4000)     
)  
AS  
BEGIN  
DECLARE @index int   
SET @index = -1   
WHILE (LEN(@text) > 0)   
BEGIN    
SET @index = CHARINDEX(@delimiter , @text)    
IF (@index = 0) AND (LEN(@text) > 0)    
  BEGIN     
    INSERT INTO @Strings VALUES (@text)  
      BREAK    
  END    
IF (@index >= 1)    
  BEGIN     
if (@index - 1) = 0  
 INSERT INTO @Strings VALUES (Null)  
else     
 INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))     
SET @text = RIGHT(@text, (LEN(@text) - @index))    
  END    
ELSE   
  SET @text = RIGHT(@text, (LEN(@text) - @index))   
END  
RETURN  
END 

请提供更多的信息。什么是SQL方言?什么DBMS?您好,欢迎来到这里,如果您尝试过somthiong,您不会向任何人支付somthing,那么请展示。我们会解决你的问题。否则谷歌它。我使用的是sql server 2008…让我解释一下…会有一个表单,我们可以在其中输入表名、字段和数据类型…然后当我们单击“创建”按钮时..它应该创建一个包含特定名称和字段的表..我需要一个存储过程。清楚吗?有人能帮我吗?没有…我做这件事时出错了。。但是我得到了另一个解决方案,它如下..您说过您的表中需要多个列和数据类型。您提供的解决方案仅适用于硬代码数据类型的一列,而在我的解决方案中,您可以通过您的代码发送这些数据类型。您遇到了哪些错误?您需要以与我在上面示例中给出的格式相同的格式将列发送到SP,它不会给您任何错误,而您之前说过您需要表中的多个列和数据类型。您提供的解决方案仅适用于一列,并且也适用于硬代码datatypeyes rite。。现在这就是我在wthr上工作的内容,我可以使alter table保持不变并不断添加列..这行吗?在方法u中,我说,我应该如何提供输入?按以下格式传递列名参数,“firstname | varchar(1000)~lastname | varchar(1000)~”我试图得到错误的语法new“|”。。如果这同样有效,如果我想在创建表后添加一列,那么我肯定也需要一个alter选项?
ALTER PROCEDURE sproc_BuildTable 
(
   @TableName NVARCHAR(128),
   @Column1Name NVARCHAR(32)
)

AS

DECLARE @Query NVARCHAR(MAX) 
BEGIN

SET @Query='CREATE TABLE '  + @TableName + '(' +@Column1Name + ' VARCHAR(200)'+ ')'
EXECUTE (@Query)

END