我想在创建时为表或视图使用变量而不是模式名称。
例如,而不是
create table dbo.TableName
我想
create table @schema.TableName
另外,我想在下面的陈述中写下上述解决方案。
IF OBJECT_ID (N'dbo.TableName', 'u') IS NOT NULL
DROP table TableName;
go
这种方式是否完全可行,如果可能哪种方式更有效。
答案 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
将其提交给服务器:
例如,创建:
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"如果您从用户那里获得对象名称,则存在风险。