声明SQL变量 - SQL Server

7

有人能够检查我的陈述吗?...

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

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

因此,@strSQL 变量将是;

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

1
可能是SQL声明变量的重复问题。 - marc_s
1
可能是SQL声明变量的重复问题。 - gbjbaanb
3个回答

2

我敢肯定最初的问题是关于MySql的(这也是我回答的内容)。但似乎Sql Server允许在DECLARE语句中重复定义类型。 - colithium
这个答案是不正确的。SQL Server 不允许 DECLARE @tblName, @strSQL varchar(MAX) 这样的语法。每个变量都必须指定类型,例如:declare @i int, @t varchar(max); - Shawn Kovac

2

请尝试我的回答中提到的方法:

 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或更新版本开始,你应该停止使用sysobjects和sysindexes - 而是使用包含更多或少相同信息的新sys架构 - 但更容易获取。
有关新sys架构中可用内容以及如何充分利用它的更多信息,请参见[MSDN:查询SQL Server系统目录][1]!
[1]: https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/catalog-views-transact-sql?view=sql-server-ver15

糟糕,我的错,我正在使用SQL Server 2008,无论如何,感谢您的帮助。 - Argel Joseph
另外一个问题是,如果我在插入命令之前在@strSQL中使用IF语句,因为我想先验证要插入的值是否不存在于表中,该怎么办?抱歉问了这么多问题...因为我刚开始学习SQL。 - Argel Joseph

1

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

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 将其作为语句运行,对于字符串中的变量也是同样的道理,您不能将其放在引号中。


1
"DSINTINCT"和"TOP 1"有点过了......如果只有一个结果,它不可能有重复项..... - marc_s
只是想确保它不会崩溃,因为可能会有一些不同的表具有相似的名称。 - Simon Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接