2013-03-20 43 views
1

我想创建函数,它使用表名作为参数。在我搜索时,我需要使用动态sql。我试试这样的代码:在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 

但是得到错误。有什么办法可以解决这个问题吗?

我尝试这样的方式

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) 

使用动态SQL,但得到Invalid use of a side-effecting operator 'EXECUTE STRING' within a function. 有谁知道如何绕过这个限制?

+3

好了,你不能在一个函数的SQL Server – Lamak 2013-03-20 13:41:38

回答

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) 
) 
+1

上使用动态SQL别忘了提及@ColumnNameValue没有声明。 – 2013-03-20 13:36:08

+3

所有的想法都是正确的,但是你不能在SQL SERVER用户定义函数中使用副作用语句。我认为他将无法完成他的任务。 – gustavodidomenico 2013-03-20 13:39:06

+0

你为什么认为他的意思是'STORED PROCEDURE'?,这个错误很可能就是他想在一个函数上使用动态sql,并且无法 – Lamak 2013-03-20 13:43:43

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.