Sql server 动态SQL不工作-符合要求,但出错
Sql server 动态SQL不工作-符合要求,但出错,sql-server,tsql,Sql Server,Tsql,在此处输入代码以运行: CREATE TABLE [dbo].[TSQL_DLOOKUP]( [LookUpTable] [nchar](10) NULL, [LookUpField] [nchar](10) NULL, [LookUpValue] [nchar](10) NULL, [LookUpDecode] [nchar](20) NULL ) ON [PRIMARY] GO The procedure: ALTER PROCEDURE [dbo].
在此处输入代码
以运行:
CREATE TABLE [dbo].[TSQL_DLOOKUP](
[LookUpTable] [nchar](10) NULL,
[LookUpField] [nchar](10) NULL,
[LookUpValue] [nchar](10) NULL,
[LookUpDecode] [nchar](20) NULL
) ON [PRIMARY]
GO
The procedure:
ALTER PROCEDURE [dbo].[MyDLookUp]
@LookUpValue NCHAR(10),
@LookUpTable NCHAR(10),
@LookUpField NCHAR(10)
AS
BEGIN
DECLARE @SQLQuery AS NVARCHAR(500)
DECLARE @ParameterDefinition AS NVARCHAR(100)
/* Build Transact-SQL String by including the parameter */
SET @SQLQuery = 'SELECT LookUpDecode FROM TSQL_DLOOKUP WHERE LookUpTable = @LookUpTable AND LookUpValue = @LookUpValue AND LookUpField =@LookUpField'
/* Execute Transact-SQL String */
EXECUTE sp_executesql @SQLQuery, @LookUpValue,@LookUpTable,@LookUpField
END
这里的想法是尽可能准确地复制MSACCESS DLOOOKUP函数。我参与了一个项目,其中存在大量重复的SQL语句,在此之前的编码人员是这样做的,我需要简化事情。您缺少定义传入参数的命令中的
@params
参数:
DECLARE @return_value int
EXEC @return_value = [dbo].[MyDLookUp]
@LookUpValue = N'F',
@LookUpTable = N'LCLASS',
@LookUpField = N'CLASS'
SELECT 'Return Value' = @return_value
The error: Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'F'.
Msg 137, Level 15, State 2, Line 1
Must declare the scalar variable "@LookUpTable".
The code compiles, but will not run. Please help.
正如拉马克所说,这里不需要动态查询,你也可以使用staic查询
EXECUTE sp_executesql @SQLQuery,
N'@LookUpValue [nchar](10),@LookUpTable [nchar](10),@LookUpField [nchar](10)',
@LookUpValue,@LookUpTable,@LookUpField
功能完成相同的工作
SELECT lookupdecode
FROM tsql_dlookup
WHERE lookuptable = @LookUpTable
AND lookupvalue = @LookUpValue
AND lookupfield = @LookUpField
如果您不需要使用动态SQL进行简单的select语句,请尝试这段代码 ---------------------------------------存储过程
CREATE FUNCTION dlookup(@LookUpValue NCHAR(10),
@LookUpTable NCHAR(10),
@LookUpField NCHAR(10))
RETURNS nchar
AS
BEGIN
declare @lookupdecode nchar(50)
SELECT top 1 @lookupdecode = lookupdecode
FROM tsql_dlookup
WHERE lookuptable = @LookUpTable
AND lookupvalue = @LookUpValue
AND lookupfield = @LookUpField
RETURN @lookupdecode
END;
正如其他人所说,在本例中不需要动态sql,因为它可以直接执行 有关您问题的答案,请参见下文 参数定义需要作为参数传递给sp_executesql sp,以便将参数传递给动态查询 因此,您的新SP将如下所示
Alter PROCEDURE [dbo].[MyDLookUp] --[dbo].[MyDLookUp] 1,2,3
@LookUpValue NCHAR(10),
@LookUpTable NCHAR(10),
@LookUpField NCHAR(10)
AS
BEGIN
SELECT LookUpDecode FROM TSQL_DLOOKUP
WHERE LookUpTable = @LookUpTable AND LookUpValue = @LookUpValue AND LookUpField =@LookUpField
END
我看不出在allOk使用动态SQL的必要性…更改了我的代码,它就可以工作了…但是你有什么想法如何把它变成函数吗?@AnthonyParker Jeez dude,请试着自己调试一下too@AnthonyParker我的错误检查现在…但您可以很容易地修复这些错误尝试理解标量函数是如何工作的works@AnthonyParker对于标量函数,需要使用模式prefix@AnthonyParker好了,这个问题开始严重地演变为“为我修复代码”,这不是为什么。此答案正确地解决了问题中所述的问题
alter PROCEDURE [dbo].[MyDLookUp]
@LookUpValue NCHAR(10),
@LookUpTable NCHAR(10),
@LookUpField NCHAR(10)
AS
BEGIN
DECLARE @SQLQuery AS NVARCHAR(500)
DECLARE @ParameterDefinition AS NVARCHAR(100)
/* Build Transact-SQL String by including the parameter */
SET @SQLQuery = 'SELECT LookUpDecode FROM TSQL_DLOOKUP WHERE LookUpValue = @LookUpValue AND LookUpTable = @LookUpTable AND LookUpField =@LookUpField'
DECLARE @ParmDefinition nvarchar(500);
SET @ParmDefinition = N'@LookUpValue NCHAR(10), @LookUpTable NCHAR(10), @LookUpField NCHAR(10)';
/* Execute Transact-SQL String */
EXECUTE sp_executesql @SQLQuery, @ParmDefinition, @LookUpValue,@LookUpTable,@LookUpField
END