【问题标题】:Declaring SQL variables - SQL Server声明 SQL 变量 - SQL Server
【发布时间】:2012-03-13 13:23:39
【问题描述】:

任何人都可以检查我的声明...

DECLARE @tblName varchar(MAX), 
        @strSQL varchar(MAX)

SET @tblName ='SELECT DISTINCT o.name as TableName 
                 FROM sysobjects o 
                 JOIN sysindexes x on o.id = x.id  
                WHERE o.name LIKE ''%empty%'''  

SET @strSQL = 'INSERT INTO @tblName VALUES(''trylng'', ''1'')'
EXEC (@strSQL)

我的错误是...

消息 1087,第 15 级,状态 2,第 1 行
必须声明表变量“@tblName”。

我要做的是获取变量@tblName上的表名,并在@strSQL变量中插入一些数据

例如...@tblName 中的结果是CustomerInfo

然后在@strSQL 中,我将在我的插入命令中使用@tblName 中的结果作为我的表名。

所以@strSQL 变量将是;

INSERT INTO CustomerInfo VALUES(......)

【问题讨论】:

标签: sql-server sql-server-2008 variables declare


【解决方案1】:

从我对你其他问题的回答中试试这个:

 SELECT TOP 1 @tblName = t.name
 FROM sys.tables t
 INNER JOIN sys.indexes i on i.object_id = t.object_id  
 WHERE t.name LIKE '%empty%'

 SET @strSQL = 'INSERT INTO ' + @tblName  + ' VALUES(''trylng'', ''1'')'
 EXEC (@strSQL)

仍然没有提及您正在使用的 SQL Server 版本。但从 SQL Server 2005 或更高版本开始,您应该停止使用 sysobjectssysindexes - 相反,使用包含或多或少相同信息的新 sys 架构 - 但更容易获得。

请参阅 [MSDN:查询 SQL Server 系统目录][1],了解有关新 sys 架构中可用内容以及如何充分利用它的更多信息!

【讨论】:

  • 哎呀,我的错,我正在使用 SQL Server 2008,nway..感谢 4 d 帮助
  • 另一件事...如果我要在插入命令之前在@strSQL 中使用 IF 语句怎么办,因为我想首先验证我要插入的值是否不存在桌子。抱歉有很多问题...因为我才开始研究 sql。
【解决方案2】:

当您使用单个 DECLARE 语句声明多个变量时,you only put the type once(在末尾):

DECLARE @tblName, @strSQL varchar(MAX)

【讨论】:

  • 我可以发誓最初的问题是关于 MySql(这是我回答的)。看来 Sql Server 允许在 DECLARE 语句中重复类型定义
  • 这个答案不正确。 SQL Server 不允许DECLARE @tblName, @strSQL varchar(MAX)必须指定每个变量的类型,例如:declare @i int, @t varchar(max);
【解决方案3】:

这应该是可以真正运行的东西:

DECLARE @tblName varchar(MAX), 
        @strSQL varchar(MAX)

SET @tblName =  (SELECT DISTINCT TOP 1  o.name as TableName 
                 FROM sysobjects o 
                 JOIN sysindexes x on o.id = x.id  
                WHERE o.name LIKE '%empty%')

SET @strSQL = 'INSERT INTO ' + @tblName + ' VALUES(''trylng'', ''1'')'
EXEC (@strSQL)

引号中的任何内容都表示这是一个字符串,不要指望sql server将其作为语句运行,与字符串中的变量相同,您不能引用它

【讨论】:

  • DSINTINCT and TOP 1 有点太多了.....如果你只有 1 个结果,那么无论如何都不可能有重复......
  • 只是想确保它不会崩溃,因为可能有一些不同的表具有相似的名称
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多