Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 动态SQL不工作-符合要求,但出错_Sql Server_Tsql - Fatal编程技术网

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