SELECT TOP @columnCount @columnName
FROM @tableName
我收到以下错误
“@columnCount”附近的语法不正确。
有什么问题?
如果我改为
SELECT TOP (@columnCount) @columnName
FROM @tableName
我收到以下错误
必须声明表变量“@tableName”。
我从 C# 运行它
SELECT TOP @columnCount @columnName
FROM @tableName
我收到以下错误
“@columnCount”附近的语法不正确。
有什么问题?
如果我改为
SELECT TOP (@columnCount) @columnName
FROM @tableName
我收到以下错误
必须声明表变量“@tableName”。
我从 C# 运行它
一种安全可靠的方法是
DECLARE @columnCount INT = 100
DECLARE @columnName NVARCHAR(128) = 'YourColumnName'
DECLARE @tableName NVARCHAR(128) = 'YourTableName'
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = N'SELECT TOP (@columnCount) ' + QUOTENAME(@columnName) + N'
FROM ' + QUOTENAME(@tableName)
EXECUTE sp_executesql @Sql
,N'@columnCount INT'
,@columnCount
您需要动态 SQL 来完成您正在尝试做的事情。
DECLARE @sql VARCHAR(max);
SET @sql = 'SELECT TOP ' + @columnCount + ' ' + @columnName + ' FROM ' + @tableName;
EXEC(@sql);
使用的变量需要进行适当的转换。
在文档中阅读更多信息
列列表和表名不能是参数。但是,由于您是从 C# 运行它,因此从技术上讲,您已经在使用动态 SQL(除非您使用这些参数调用存储过程,但这里没有提到使用存储过程,所以现在我假设不会)。在 C# 中构建 SQL 时,您需要将列列表和表名称连接到查询中,但您仍然可以为 TOP() 运算符使用的值使用参数:
SqlConnection _Connection = new SqlConnection("connection string");
SqlCommand _Command = new SqlCommand();
SqlDataReader _Reader = null;
string _Query;
string _TableName = "dbo.MyTable";
string _ColumnList = "Field1, Field2 AS [AliasedName], Field3";
int _NumberOfRows = 12;
_Query = String.Concat("SELECT TOP (@NumberOfRows) ",
_ColumnList, " FROM ", _TableName);
SqlParameter _NumRows = new SqlParameter("@NumberOfRows", SqlDbType.Int);
_NumRows.Value = _NumberOfRows;
try
{
_Connection.Open();
_Reader = _Command.ExecuteReader();
// do stuff
}
finally
{
_Reader.Close();
_Connection.Close();
}
当然,您也可以将 @NumberOfRows 值直接连接到查询中,但是如果使用相同的 ColumnList 和 TableName 值多次运行此查询但更改@NumberOfRows 值。