存储过程不会创建新表

时间:2018-01-07 13:49:46

标签: asp.net sql-server

我正在尝试在SQL Server数据库中动态创建表。

与文本框中的输入一样:

ALTER PROCEDURE [dbo].[opretNyEsyn]
    @Navn NVARCHAR(100)
AS
BEGIN
    DECLARE @SQLString NVARCHAR(MAX)

    SET @SQLString = 'create table ' + QUOTENAME(@Navn) +
                     '([EsynNummer][int]Identity(1,1),
                       [Dato][datetime])'
END

但是当我从表单中运行方法时没有任何反应,表格没有创建,我没有错误。

我错过了什么?

的通知。这只是一张测试表。它最终应该看起来像这样。

提前致谢

2 个答案:

答案 0 :(得分:1)

您只是创建语句,但是为了创建表,您需要使用sp_executesql SP的EXEC语句执行该语句。在Procedure中添加一个execute语句。喜欢这个

ALTER PROCEDURE [dbo].[opretNyEsyn]
@Navn nvarchar(100)
as
Begin

declare @SQLString nvarchar(max)
set @SQLString = 'create table ' + QUOTENAME(@Navn)+
'([EsynNummer][int]Identity(1,1),
[Dato][datetime])'

exec(@SQLString)-- Execute the Statement

End
Go

答案 1 :(得分:1)

您需要执行动态SQL:

ALTER PROCEDURE [dbo].[opretNyEsyn]
@Navn SYSNAME
as
Begin
declare @SQLString nvarchar(max);
set @SQLString = 'create table ' + QUOTENAME(@Navn)+
'([EsynNummer][int]Identity(1,1),
[Dato][datetime])';
EXECUTE (@SQLString);
End;

无论如何,我建议您阅读The Curse and Blessings of Dynamic SQLPackaging Permissions in Stored Procedures

  

CREATE TABLE @tbl

     

这里的愿望是创建一个在运行时确定名称的表。

     

如果我们只是查看反对在存储过程中使用动态SQL的参数,那么它们中很少有真正适用。如果存储过程中包含静态CREATE TABLE,则运行该过程的用户必须具有创建表的权限,因此动态SQL不会更改任何内容。计划缓存显然与它无关。等

     

尽管如此:为什么?你为什么想做这个?如果您在应用程序中动态创建表,则错过了有关数据库设计的一些基础知识。在关系数据库中,表和列的集合应该是常量。它们可能随着新版本的安装而改变,但在运行期间不会改变。