是否可以传入对表名的引用并将其与已知的数据库和模式引用连接?例如,我试图编写一个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
答案 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