[英]Pass Column Name as parameter
I want to PassColumn name as a paremeter in My SP And if my tat column exists in first table (Batch_Master), want to fatch value from that column, 我想将PassColumn名称用作我的SP中的参数,并且如果我的tat列存在于第一个表(Batch_Master)中,则想对该列中的值进行赋值,
And if that column exists in my second table (GTIN_Master), want to fetch value from tat table column, Each table have columns like.. Batch_Master (Batch_M_id, GTIN(primary key),....etc GTIN_Master (GTIN (foreign key),..etc) 如果在我的第二个表(GTIN_Master)存在列,希望从达表列取值,每个表都列如.. Batch_Master(Batch_M_id,GTIN(主键),....等GTIN_Master(GTIN(外键),..等等)
I have Batch_M_id , and column name as a parameter.. 我有Batch_M_id和列名作为参数。
Note: column Name having random datatype, some time int or some time datetime etc 注意:列名称具有随机数据类型,某个时间int或某个时间datetime等
I Try followin SP 我尝试关注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 =@batchmId
end
RETURN
What you need when you do not know exactly the query structure you are going to execute, then you have to create a dynamic query, which is actually a form of templating queries. 当您不完全知道要执行的查询结构时需要什么,那么您必须创建一个动态查询,这实际上是模板查询的一种形式。
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
The above will do what you want but is prone to errors. 上面的代码可以做您想要的,但是容易出错。 For instance what if the column passed in the parameter does not exist in the tables used in the second query? 例如,如果第二个查询中使用的表中不存在传入参数的列,该怎么办? You should probably need to check for existence in the second case too. 您可能还需要在第二种情况下检查是否存在。
DECLARE @SQL VARCHAR(MAX)
SET @SQL = 'select ' + @columnName + ' from Batch_Master'
EXECUTE(@SQL)
This SQL: 此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
Returns the following: 返回以下内容:
name
-------------------------
Table One
value
-------------------------
Table Two
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.