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

Sql server 使用变量而不是模式,例如dbo。用于创建表,sql-server,variables,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 这种方式完全可能吗?如果可能的话,哪种方式更有效 您可以构建连接对象名称的语句,并使用sp_executesql将其提交到服

我希望在创建表或视图时使用变量而不是模式名

如代替

create table dbo.TableName
我想

create table @schema.TableName
此外,我还想用上述解决方案写下以下声明

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

这种方式完全可能吗?如果可能的话,哪种方式更有效

您可以构建连接对象名称的语句,并使用
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注入”风险。

您需要研究“sqlcmd”模式

例如。注意,在SSMS中,在“查询”下有一个需要启用的“SqlCmd模式”菜单项

: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'

您不能对模式、表或视图名称、列名等使用变量或函数-这些内容必须以文本形式拼写-除非您对所有内容都使用动态SQL(不推荐!),但这又如何呢?如果对象_ID(N'dbo.TableName,'u')不是NULL,请删除表TableName;GO您能帮我使用sp_executesql中的函数吗?例如,使用EXECUTE sp_executesql dbo.myfunction(param1,param2)@Arashbahreini:您不能在
sp_executesql
调用中直接使用函数-您必须在实际调用
sp_executesql
@Arashbahreini之前为执行准备字符串(单引号之间的函数调用)您是否尝试过
执行sp_executesql'dbo.myfunction(param1,param2)
?我会选择sqlcmd模式而不是字符串连接。sqlcmd.exe是一个命令行工具,允许变量通过命令行传递到过程中。我建议不要随意(不注意)上面的短语“Sql注入附加”……sqlcmd没有那么复杂。祝你好运请记住,您早期做出的任何设计决策都会让您在未来的道路上花费成倍的时间。