1

テーブル名をパラメーターとして使用する関数を作成したい。検索すると、動的SQLを使用する必要があります。私はそのようなコードを試します:

CREATE FUNCTION get_column_id
    (
    @TableName VARCHAR(30),
    @ColumnName VARCHAR(30),
    )
RETURNS int 
AS
BEGIN
IF EXISTS 
    (
    DECLARE @SQL VARCHAR(50)
    SET @sql = 'SELECT' + @ColumnName + 'FROM' + @TableName + 'WHERE @ColumnName =    @ColumnNameValue';
    EXEC(@sql)
    )
BEGIN

しかし、エラーが発生します。これを進める方法はどこにありますか?

そのような方法で動的SQLを使用してみます

DECLARE @SQL VARCHAR(50)
SET @SQL = 'SELECT' + @ColumnName + 'FROM' + @Table + 'WHERE @ColumnName = @ColumnNameValue'
EXEC(@SQL)
DECLARE @TableName table (Name VARCHAR(30))
INSERT INTO @TableName VALUES (@SQL)
IF EXISTS 
    (SELECT Name FROM @TableName WHERE Name = @ColumnNameValue)

しかし、Invalid use of a side-effecting operator 'EXECUTE STRING' within a function. 誰でもこの制約を回避する方法を知っていますか?

4

2 に答える 2

2

エラーは、間にスペースがない文字列の連結です。

SET @sql = 'SELECT ' + @ColumnName + ' FROM ' + @TableName + ' WHERE ' + @ColumnName + ' = ' + @ColumnNameValue;
               -- ^ SPACE HERE        ^    ^                  ^ and here

たとえば、列のデータ型が文字列の場合、値を一重引用符で囲む必要があります。

SET @sql = 'SELECT ' + @ColumnName + ' FROM ' + @TableName + ' WHERE ' + @ColumnName + ' = ''' + @ColumnNameValue + '''';

更新 1

パラメータも宣言する必要があります@ColumnNameValue

CREATE FUNCTION get_column_id
(
    @TableName VARCHAR(30),
    @ColumnName VARCHAR(30),
    @ColumnNameValue VARCHAR(30)
)
于 2013-03-20T13:30:36.030 に答える
1

Sql Server の UDF (ユーザー定義関数) は決定論的でなければなりません。構文エラーのほかに、タスクを達成することはできません。

MSDN でこの記事を確認すると、次のようになります。

http://msdn.microsoft.com/en-us/library/ms178091.aspx

以下の引用を見ることができます:

Deterministic functions always return the same result any time they are called 
with a specific set of input values and given the same state of the database.    

Nondeterministic functions may return different results each time they are 
called with a specific set of input values even if the database state that 
they access remains the same.
于 2013-03-20T13:46:55.663 に答える