Reputation: 1640
CREATE PROCEDURE dbo.usp_testing
AS
BEGIN
DECLARE @STATE INT,@TBLNAME sysname,@TrID VARCHAR(50),@FAMILYID VARCHAR(50),@SQL varchar(8000)
DECLARE cur CURSOR FOR
SELECT TrID,TableName
FROM LogTable
WHERE Prefix='vid'
AND YEAR(DateTime)=YEAR(GETDATE())AND MONTH(DateTime)=MONTH(GETDATE())AND DAY(DateTime)=DAY(GETDATE())
OPEN cur
FETCH NEXT FROM cur
INTO @TrID,@TBLNAME
IF(@TBLNAME='Student' OR @TBLNAME='Family' OR @TBLNAME='College')
BEGIN
**select @SQL='SELECT MemberID FROM'+' '+@TBLNAME+' '+'where TrId='+@TrID
select @FAMILYID=EXEC(@SQL)**
In this line, its gving me an error.
select @SQL='select @ID=(SELECT MemberID FROM'+' '+@TBLNAME+' '+'where TrId='+@TrID +')'
as well as in this too
exec(@sql)
END
END
GO
I need to put the MemberID in the variable @ID
Hi, I have done few changes as explained below
ALTER PROCEDURE [dbo].[USP_TESTSP]
AS
BEGIN
DECLARE @SQL nvarchar(max),@TABLENAME sysname,@id nvarchar(max)
SELECT @TABLENAME='student'
select @SQL= 'select @id=MemberID FROM'+' '+@TABLENAME+' '+'where TrId=11091'
exec sp_executesql @SQL,'@id nvarchar(max)output',@id=@id output
--select exec (@SQL)
END
but getting an error as:
Procedure expects parameter '@parameters' of type 'ntext/nchar/nvarchar'.
Upvotes: 1
Views: 2029
Reputation: 238226
Consider using sp_executesql
with an output parameter:
declare @SQL nvarchar(max)
set @SQL='SELECT @FAMILYID = MemberID FROM ' + @TBLNAME + ' where TrId=' + @TrID
exec sp_executesql @SQL, N'@FAMILYID int out', @FAMILYID = @FAMILYID out
Upvotes: 1
Reputation: 77707
The parameter of sp_executesql
where the formal arguments of your dynamic query are declared, '@id nvarchar(max)output'
, should be a unicode string. In Transact-SQL, to specify that a string constant is in fact a unicode string, you need to put N
before the opening quotation mark, like this:
N'@id nvarchar(max)output'
So your USP_TESTSP
should look like this:
ALTER PROCEDURE [dbo].[USP_TESTSP]
AS
BEGIN
DECLARE @SQL nvarchar(max),@TABLENAME sysname,@id nvarchar(max)
SELECT @TABLENAME='student'
select @SQL= 'select @id=MemberID FROM'+' '+@TABLENAME+' '+'where TrId=11091'
exec sp_executesql @SQL,N'@id nvarchar(max)output',@id=@id output
--select exec (@SQL)
END
Upvotes: 1
Reputation: 25763
It works for me:
select @SQL='SELECT @FAMILYID=MemberID FROM'+' '+@TBLNAME+' '+'where TrId='+@TrID
select EXEC(@SQL)
Upvotes: 0