T-SQL在函数中将“table_name”扩展为“db.dbo.table_name”

时间:2014-09-25 20:23:11

标签: sql sql-server

是否可以传入对表名的引用并将其与已知的数据库和模式引用连接?例如,我试图编写一个t-sql函数来返回一个基于三个参数的值,目标表中的列名,一个id字段和一个没有db.dbo引用的表名,以方便起见。我希望能够编写dbo.getvalueforid('NAME', 'NAME_ID', 'NAME_TABLE')并在函数中引用DB.DBO,以便生成SELECT NAME FROM [DB].[DBO].NAME_TABLE WHERE NAME_ID = NAME_TABLE.ID

这里的参考是我正在处理的功能:

IF OBJECT_ID (N'dbo.getvalueforid', N'FN') IS NOT NULL
    DROP FUNCTION getvalueforid;
GO
CREATE FUNCTION dbo.getvalueforid(@colname varchar(20), @idfield varchar(20), @targettable varchar(20))
RETURNS varchar(255)
AS 
-- Returns the name from nameid.
BEGIN
    DECLARE @value varchar(255);
    SELECT  @value = @colname
    FROM '[DB].[DBO].' + @targettable n 
    WHERE @idfield = n.u2_id; 
    RETURN @value;
END;
GO

1 个答案:

答案 0 :(得分:0)

我打算写一下Sean Lange已经在你的评论部分中解释的内容,因此以下是存储过程。

此外,我在select语句中使用了TOP 1子句,以防万一有重复,所以程序不会出错。

CREATE PROCEDURE dbo.getvalueforid
  @colname     SYSNAME
, @idfield     SYSNAME
, @targettable SYSNAME
, @Value       varchar(255) OUTPUT
AS 
BEGIN
  SET NOCOUNT ON;
 DECLARE @Sql NVARCHAR(MAX);

SET @Sql = N' SELECT TOP 1 @Value  = ' + QUOTENAME(@colname)
         + N' FROM [DB].[DBO].'+ QUOTENAME(@targettable)
         + N' WHERE ' + QUOTENAME(@idfield) + N' = u2_id'

EXECUTE sp_executesql @Sql
                     ,N'@Value varchar(255) OUTPUT'
                     ,@Value OUTPUT
END
GO