2013-09-06 6 views
0

Я хочу PassColumn имя как paremeter в My SP И если мой тат столбец существует в первой таблице (Batch_Master), хочу fatch значение из этого столбца,Pass Имя столбца в качестве параметра

И если этот столбец существует в моей второй таблице (GTIN_Master), хотите получить значение из столбца таблицы tat, Каждая таблица имеет такие столбцы, как. Batch_Master (Batch_M_id, GTIN (первичный ключ), .... и т. д. GTIN_Master (GTIN (внешний ключ) , .. и т. д.)

У меня есть Batch_M_id И имя столбца в качестве параметра ..

Примечание: Имя столбца, имеющие случайный тип данных, некоторое время Int или некоторое время DATETIME и т.д.

I Постарайся followin SP

CREATE PROCEDURE dbo.StoredProcedure2 

    @columnName varchar(50), 
    @batchmId int 
AS 

if exists(select * from sys.columns 
      where Name = N'columnName' and Object_ID = Object_ID(NBatch_Master'))  

begin 

select @columnName from Batch_Master 

end 


else 

begin 

select @columnName 
    from GTIN_Master inner join Batch_Master 
    on GTIN_Master.GTIN = Batch_Master.GTIN 
    where Batch_M_id [email protected] 


    end 
    RETURN 
+0

Хотеть спараметрировать на имена столбцов, как правило, признак того, что модель данных неверна. Если данные в двух столбцах (будь то в одной таблице или разных таблицах) являются «взаимозаменяемыми», вероятно, они должны были быть смоделированы как один столбец (возможно, с новым столбцом, содержащим дифференцирующий фактор как * данные *, а не встроенным в имя столбца/таблицы). –

ответ

1

Что вам нужно, когда вы не знаете точно структуру запроса, которую собираетесь выполнить, тогда вам нужно создать динамический запрос, который на самом деле является формой шаблонных запросов.

CREATE PROCEDURE dbo.StoredProcedure2 

    @columnName varchar(50), 
    @batchmId int 
AS 

    DECLARE @SQL1 AS VARCHAR(MAX) 
    DECLARE @SQL2 AS VARCHAR(MAX) 

    SET @SQL1 = 'select ' + @columnName + ' from Batch_Master' 

    SET @SQL1 = 'select ' + @columnName + ' 
     from GTIN_Master inner join Batch_Master 
     on GTIN_Master.GTIN = Batch_Master.GTIN 
     where Batch_M_id =' + CONVERT(VARCHAR,@batchmId) 

    IF EXISTS(SELECT * FROM sys.columns WHERE Name = @columnName and Object_ID = Object_ID(N'Batch_Master')) 
     BEGIN  
      EXEC (@SQL1) 
     END 
    ELSE 
     BEGIN 
      EXEC (@SQL2) 
     END 

Вышеуказанное будет делать то, что вы хотите, но подвержено ошибкам. Например, что, если столбец, переданный в параметре, не существует в таблицах, используемых во втором запросе? Вероятно, вам нужно также проверить наличие во втором случае.

+0

эй спасибо за ваш SP, но он всегда выполняет другое условие, он никогда не входит в состояние If ... –

+0

@VARUNNAYAK Я только что скопировал это из вашего sp? Работает ли ваша работа? –

+0

@VARUNNAYAK Не обращайте внимания, я понял. Вы передавали columnName как строку, и я просто скопировал его. Вместо этого вы должны использовать переменную. Проверьте это сейчас ... –

0
DECLARE @SQL VARCHAR(MAX) 
SET @SQL = 'select ' + @columnName + ' from Batch_Master' 

EXECUTE(@SQL) 
0

Это SQL:

set nocount on 
go 

create table One (id int, name varchar(25)) 
go 
create table Two (id int, value varchar(25)) 
go 

insert into One values (1, 'Table One') 
insert into Two values (1, 'Table Two') 
go 

create procedure sp_test_colname 
    @colname sysname 
as 
    declare @sql nvarchar(2048) 

    if exists (select 1 from sys.columns where name = @colname and object_id = object_id(N'One')) 
    set @sql = 'select [' + @colname + '] from [One]' 
    else 
    if exists (select 1 from sys.columns where name = @colname and object_id = object_id(N'Two')) 
     set @sql = 'select [' + @colname + '] from [Two]' 

    if @sql <> '' 
    exec sp_executesql @sql 
go 

exec sp_test_colname 'name' 
exec sp_test_colname 'value' 
exec sp_test_colname 'somethingelse' 
go 

drop procedure sp_test_colname 
drop table One, Two 

Возвращает следующее:

name 
------------------------- 
Table One 

value 
------------------------- 
Table Two 
Смежные вопросы