我想创建一个存储过程来创建包含我们在表单中输入的名称和字段的表。
答案 0 :(得分:0)
下面是SP,它将为您创建动态表。您需要将tablename作为第一个参数传递,第二个参数中的列名称由tilde`分隔,并且由pipe |
分隔的列名和数据类型--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
答案 1 :(得分:0)
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