【问题标题】:Dynamic SQL - Invalid object name error动态 SQL - 无效的对象名称错误
【发布时间】:2018-08-23 21:04:19
【问题描述】:

我在 SQL Server 2008 上使用动态 SQL 从一行中选择指定的列,但我不断收到以下错误:

无效的对象名称“表单”

我的代码如下:

DECLARE @SQL varchar(MAX)

SET @SQL = 'select 
[City],[Place]'
+
'
from Form where [Age:] =  20'

EXEC (@SQL)

我也尝试使用+ QUOTENAME(@Table) 并将@Table 声明为nvarchar(MAX),但无法定义@Table 基本上是我数据库中的Form 表。

当我检查之前的examples 时,人们能够以相同的方式从表中选择列而不会出错,那么我得到错误的原因可能是什么?我应该使用@QUOTENAME 函数吗?

我们将不胜感激。

【问题讨论】:

  • 你描述@table?您的查询在哪里?
  • Form 是什么?这是你的表名吗?
  • 您是否检查过您是否有名称为Form 的表?
  • 首先,我确定我确实有一个名为Form 的表,因为我可以对其进行基本操作。而且我还删除了@Table 声明,因为我无法将@Table 设置为数据库中的表单表。
  • 执行PRINT @SQL,复制结果并粘贴到新的查询窗口并执行。有什么错误吗?

标签: sql sql-server sql-server-2008


【解决方案1】:

试试下面的查询,如果你仍然得到错误检查基本的东西。

DECLARE @SQL varchar(MAX)
SET @SQL = 'select [City],[Place] from [Form] where [Age] =  20'
EXEC (@SQL)
  1. [Form] 是否存在于数据库中?
  2. 您是否在正确的数据库中运行?
  3. 我看到 ":" 在 AGE 之后是列名吗?
  4. 如果 Age 是 varchar,请尝试在 20 前后添加“'”。

【讨论】:

  • 已经解决了,谢谢。我应该更好地检查语法,因为动态编程中没有更正系统,因为我们用引号编写查询。我导入的数据库名为'Form',而不是Form(@Nisarg 也警告过我)。查询的其余部分写成 true。
【解决方案2】:

你描述了@table。 Table 是一个保留关键字,因此最好不要使用该词。让我们假设@mytable 是一个包含查询表名的变量。在这种情况下,您可以像处理字符串的其余部分一样进行连接。 您还需要连接到您尝试查询的数据库。

例如:

DECLARE @SQL varchar(MAX)
DECLARE @mytable varchar(1000) = 'Form' --put the table name here

SET @SQL = 'select [City], [Place] '
         + 'from ' + @mytable + ' where [Age:] =  20'

EXEC (@SQL)

【讨论】:

  • 虽然table是保留字,但使用变量@table一点问题都没有
  • 是的。但是,如果您以这种方式声明变量,它将在 stackoverflow 中使用保留关键字 color 突出显示 @table。此外,您可以使用带括号的保留关键字...例如CREATE [TABLE] TABLE (...),这是有效的,但任何 DBA 都会告诉您不要这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
相关资源
最近更新 更多