我正在尝试将col
和value
作为函数参数并计划在查询中使用它们。
不幸的是,我@Col
的值被视为string
,而不是列标识符。
即,如果我将name
指定为@Col
参数的值,则会将其视为'name'
而不是name
,因此,对函数的调用始终返回NULL
作为结果
您是否遇到过类似的情况?你能否请我更好地处理这种情况?
以下是我的功能供您参考:
CREATE FUNCTION [dbo].[FN_FindIdBy]
(
@Col NVARCHAR(255),
@Value NVARCHAR(255)
)
RETURNS INT
AS
BEGIN
DECLARE @Id INT = NULL
SET @Id = (SELECT ID FROM dbo.MYWORK WHERE (CONVERT(NVARCHAR(255), @Col) = @Value))
IF @Id IS NOT NULL RETURN @Id
RETURN NULL
END
非常感谢您对此进行调查。
答案 0 :(得分:2)
以下工作,但您必须将其用作过程并创建动态sql。
create table MYWORK (ID int identity, Name nvarchar(255))
insert into MYWORK(Name)
select 'a'
union select 'b'
union select 'c'
union select 'd'
union select 'e'
union select 'f'
CREATE procedure [dbo].[EPG_FN_FindIdBy]
@Col NVARCHAR(255),
@Value NVARCHAR(255)
AS
BEGIN
DECLARE @Id nvarchar(255)
, @ParmDefinition nvarchar(255)
, @sql nvarchar(max)
set @sql = N'SELECT @IdOUT = ID FROM dbo.MYWORK WHERE '+ @Col +' = ''' + @Value + ''''
set @ParmDefinition = N'@IdOUT nvarchar(255) OUTPUT'
PRINT @sql
EXECUTE sp_executesql @sql,@ParmDefinition, @IdOUT = @Id OUTPUT
SELECT @Id as ID
END
运行此命令,它将返回匹配的行
Exec dbo.EPG_FN_FindIdBy @Col = 'Name', @Value = 'a'
并且为NULL
Exec dbo.EPG_FN_FindIdBy @Col = 'Name', @Value = 'g'
答案 1 :(得分:0)
是的,几乎总是有一种比使用动态SQL更好的查询方式。
查看CASE运营商的这种用法。
SELECT id
FROM dbo.MYWORK
WHERE CASE @Col
WHEN 'a' THEN [a]
WHEN 'b' THEN [b]
WHEN 'c' THEN [c]
END = @Value
表中有列[a],[b]和[c]。