0
SELECT TOP @columnCount @columnName 
FROM @tableName

次のエラーが表示されます

「@columnCount」付近の構文が正しくありません。

何が間違っている可能性がありますか?

私がに変更した場合

SELECT TOP (@columnCount) @columnName 
FROM @tableName

次のエラーが表示されます

テーブル変数「@tableName」を宣言する必要があります。

C#から実行します

4

3 に答える 3

3

安全で確実な方法は

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
于 2014-06-02T13:29:22.237 に答える
1

列リストとテーブル名をパラメーターにすることはできません。ただし、これを 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 値。

于 2014-06-02T14:06:07.453 に答える