我正在尝试在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
但是当我从表单中运行方法时没有任何反应,表格没有创建,我没有错误。
我错过了什么?
的通知。这只是一张测试表。它最终应该看起来像这样。
提前致谢
答案 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 SQL和Packaging Permissions in Stored Procedures:
CREATE TABLE @tbl
这里的愿望是创建一个在运行时确定名称的表。
如果我们只是查看反对在存储过程中使用动态SQL的参数,那么它们中很少有真正适用。如果存储过程中包含静态CREATE TABLE,则运行该过程的用户必须具有创建表的权限,因此动态SQL不会更改任何内容。计划缓存显然与它无关。等
尽管如此:为什么?你为什么想做这个?如果您在应用程序中动态创建表,则错过了有关数据库设计的一些基础知识。在关系数据库中,表和列的集合应该是常量。它们可能随着新版本的安装而改变,但在运行期间不会改变。