使用变量而不是模式例如dbo。用于创建表

时间:2014-09-04 20:29:40

标签: sql-server variables

我想在创建时为表或视图使用变量而不是模式名称。

例如,而不是

create table dbo.TableName

我想

create table @schema.TableName

另外,我想在下面的陈述中写下上述解决方案。

IF OBJECT_ID (N'dbo.TableName', 'u') IS NOT NULL
    DROP table TableName;
go

这种方式是否完全可行,如果可能哪种方式更有效。

2 个答案:

答案 0 :(得分:2)

你需要研究" sqlcmd"模式。

http://msdn.microsoft.com/en-us/library/ms174187.aspx

实施例。注意,在SSMS中,Under" Query"有一个" SqlCmd Mode"您需要启用的菜单项。

:setvar MySchemaName "dbo"


IF EXISTS ( SELECT * FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = N'$(MySchemaName)' and TABLE_NAME = N'Ticket' and TABLE_TYPE = N'BASE TABLE' ) 
BEGIN 
DROP TABLE [$(MySchemaName)].[Ticket] 
END 
GO


CREATE TABLE [$(MySchemaName)].[Ticket] ( 
    [TicketUUID] [uniqueidentifier] NOT NULL,
    [CreateDate] [datetime] NOT NULL DEFAULT CURRENT_TIMESTAMP
    )

GO


SELECT * FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = N'$(MySchemaName)' and TABLE_NAME = N'Ticket' and TABLE_TYPE = N'BASE TABLE'

答案 1 :(得分:1)

您可以构建连接对象名称的语句,并使用sp_executesql将其提交给服务器:

Using sp_executesql

例如,创建:

DECLARE @SQLString NVARCHAR(500);
DECLARE @TableName NVARCHAR(100);

SET @TableName = 'dbo.TableName';
SET @SQLString = 'CREATE TABLE ' +  @TableName + ' ...';

EXECUTE sp_executesql @SQLString;

并放弃:

SET @TableName = 'dbo.TableName';
SET @SQLString = 'IF OBJECT_ID (''' + @TableName + ''', ''u'') IS NOT NULL DROP table ' + @TableName;

EXECUTE sp_executesql @SQLString;

你必须减轻" Sql Injection"如果您从用户那里获得对象名称,则存在风险。