SQL SP:动态查询

时间:2012-02-13 21:08:23

标签: sql sql-server sql-server-2008 sql-server-2005 tsql

我正在尝试将colvalue作为函数参数并计划在查询中使用它们。

不幸的是,我@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

非常感谢您对此进行调查。

2 个答案:

答案 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]。