Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:靠近'的语法不正确@';_Sql_Sql Server - Fatal编程技术网

SQL Server:靠近'的语法不正确@';

SQL Server:靠近'的语法不正确@';,sql,sql-server,Sql,Sql Server,我已经在网上搜索了一整天,但我不知道搜索解决方案的关键字是什么,所以我来到这里 下面是我的示例SQL查询的一部分: DECLARE @column_name varchar(50) SET @column_name = 'test' SELECT t1.@column_name, t2.@column_name FROM table_test AS t1 INNER JOIN table_test2 AS t2 ON t2.id = t1.id 运行此

我已经在网上搜索了一整天,但我不知道搜索解决方案的关键字是什么,所以我来到这里

下面是我的示例SQL查询的一部分:

DECLARE @column_name varchar(50)
SET @column_name = 'test'

SELECT
    t1.@column_name,
    t2.@column_name
FROM 
    table_test AS t1  
INNER JOIN 
    table_test2 AS t2 ON t2.id = t1.id
运行此查询时,出现以下错误:

“@column_name”附近的语法不正确

靠近
t1.@column\u name
t2.@column\u name


如何解决此错误?我一直在尝试用括号括起来,但仍然不起作用。

您需要使用动态SQL来实现这一点。这将使用
sys
对象,因为避免SQL注入非常重要

DECLARE @column_name varchar(50)
SET @column_name = 'test'

DECLARE @SQL nvarchar(MAX);

SELECT @SQL = N'
SELECT t1.' + QUOTENAME(c.[name])
FROM sys.tables t
     JOIN sys.columns c ON t.object_id = c.object_id
WHERE t.[name] = 'table_test'
  AND c.[name] = @column_name;

SELECT @SQL = @SQL + N'
       t2.'+ QUOTENAME(c.[name])
FROM sys.tables t
     JOIN sys.columns c ON t.object_id = c.object_id
WHERE t.[name] = 'table_test2'
  AND c.[name] = @column_name;

SELECT @SQL = @SQL + N'
FROM table_test t1
     JOIN Tabletest_2 t2 ON t1.id = t2.id;';

PRINT @SQL;
--EXEC sp_executesql @SQL; --Uncomment to run the SQL

如果您不理解这些,请询问。

您不能参数化数据库中的事物名称。您必须使用字符串来生成正确的SQL。如果SQL Server希望您为它命名,那么您将为它命名一个字符串(包含在变量中)。这些都是不一样的东西。那么有没有其他方法可以让事情顺利进行呢?我对SQL非常陌生,这就是为什么。如果您需要以这种方式动态定义列名,那么您可能有一个数据库模型issue@Nick.McDermaid因为我实际上是使用游标从信息模式表中获取列名的。所以它是以这种格式返回的。我就是这样想的,除非你有更好的解决办法:)好吧,试着用你的方法,效果很好。谢谢你明白它在做什么吗?对于动态SQL,避免SQL注入的重要性是巨大的。我很乐意解释一下。只是想告诉您,t1.id=t2.id;'上的行
jointtabletest_2
有一个轻微的代码错误,您忘记将t2分配给Tabletest_2:)如果我错了,请纠正我,基本上您是在将表和列名与sys.table和sys.columns进行比较。基本上,如果有人试图注入任何东西,这段SQL查询将不会运行,因为在从sys.table和columnCorrect进行验证后,它不会返回所需的值。该列必须同时存在于表
table_test
table_test2
中。如果没有,则第一个或第二个
SELECT
语句将返回
NULL
,导致
@SQL
具有值
NULL
。因此,
sp_executesql
不运行任何操作。:)很高兴看到你能理解。