SQL SP: динамический запрос - PullRequest
       0

SQL SP: динамический запрос

0 голосов
/ 14 февраля 2012

Я пытаюсь получить 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

Большое спасибо за внимание к этому.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Следующее работает, но вы должны использовать его как процедуру и создать динамический 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'
0 голосов
/ 14 февраля 2012

Да, почти всегда есть лучший способ запроса, чем использование динамического 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].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...