Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 那个密码是什么语言?嗨,托马斯,为我的回复太慢而道歉。我觉得你的解决方案很好。我假设这只是一个报表构造函数,所以性能构建查询实际上并不是一个优先事项。我不会喋喋不休地谈论游标等的使用。我唯一能发现的可能会给您带来问题的是您传递到字符串中的@Conditio_Sql Server_Xml - Fatal编程技术网

Sql server 那个密码是什么语言?嗨,托马斯,为我的回复太慢而道歉。我觉得你的解决方案很好。我假设这只是一个报表构造函数,所以性能构建查询实际上并不是一个优先事项。我不会喋喋不休地谈论游标等的使用。我唯一能发现的可能会给您带来问题的是您传递到字符串中的@Conditio

Sql server 那个密码是什么语言?嗨,托马斯,为我的回复太慢而道歉。我觉得你的解决方案很好。我假设这只是一个报表构造函数,所以性能构建查询实际上并不是一个优先事项。我不会喋喋不休地谈论游标等的使用。我唯一能发现的可能会给您带来问题的是您传递到字符串中的@Conditio,sql-server,xml,Sql Server,Xml,那个密码是什么语言?嗨,托马斯,为我的回复太慢而道歉。我觉得你的解决方案很好。我假设这只是一个报表构造函数,所以性能构建查询实际上并不是一个优先事项。我不会喋喋不休地谈论游标等的使用。我唯一能发现的可能会给您带来问题的是您传递到字符串中的@ConditionData变量,如果该变量包含一个包含单引号的字符串,您生成的查询将有语法错误-您可能希望对其进行转义。感谢您指出好的方面。因此,我将在@ConditionData中用双引号替换单引号,如replace(@ConditionData,“”,“”


那个密码是什么语言?嗨,托马斯,为我的回复太慢而道歉。我觉得你的解决方案很好。我假设这只是一个报表构造函数,所以性能构建查询实际上并不是一个优先事项。我不会喋喋不休地谈论游标等的使用。我唯一能发现的可能会给您带来问题的是您传递到字符串中的@ConditionData变量,如果该变量包含一个包含单引号的字符串,您生成的查询将有语法错误-您可能希望对其进行转义。感谢您指出好的方面。因此,我将在@ConditionData中用双引号替换单引号,如replace(@ConditionData,“”,“”,“”)。任何其他建议Ye,当您向where子句添加日期时,您正在将表date转换为varchar 112,这很好,但是您也将@ConditionData转换为VARCAR 112,这可能不正确,因为ConditionData不是日期,112样式将无效,您应该首先将ConditionData转换为具有验证等功能的日期(即捕捉胭脂日期),然后将结果转换为varchar–希望有意义。好主意,我将尝试生成where子句but'(搜索字段)[1]。为什么总是(SearchField)[1]和(FilterCondition)[1]我编辑了我的帖子,如果可能的话,请看一看并回答。非常感谢您的支持,这有助于最初的开始。新年快乐。这是我的最新脚本,您可以从中了解我如何在sql server中开发通用搜索SP。我在我的帖子底部加了一个。如果它能发展出更好的方式,请看一看并发表评论。thanks@Thomas作为对第一条注释的响应,[1]是一个排序的数组指示符,例如根节点中有多个同名节点,[1]只告诉SQL只读取第一个节点——如果xml以这种方式排列,这是避免运行时错误的常见做法——在您的示例中,根节点是“/NewDataSet/param”。
<NewDataSet>  
<param>  
<SearchField>EmployeeID</SearchField>  
<FilterCondition> >= </FilterCondition>  
<ConditionData>201</ConditionData>  
<MatchCase>0</MatchCase>  
</params>
<param>    
<SearchField>DeptID</SearchField>  
<FilterCondition> = </FilterCondition>  
<ConditionData>AC01</ConditionData>  
<MatchCase>0</MatchCase>  
</params>  
<param>    
<SearchField>Dob</SearchField>  
<FilterCondition> <= </FilterCondition>  
<ConditionData>23-MAR-2010</ConditionData>  
<MatchCase>0</MatchCase>  
</params>  
</NewDataSet>  
INSERT INTO @tbl_WhereClause (SearchField, Operator, ConditionData,   MatchCase,TableName)
SELECT  A.B.value('(SearchField)[1]', 'VARCHAR(255)' ) SearchField, 
    A.B.value('(FilterCondition)[1]', 'VARCHAR(25)' ) Operator, 
    A.B.value('(ConditionData)[1]', 'VARCHAR(MAX)' ) ConditionData,
    A.B.value('(MatchCase)[1]', 'BIT' ) MatchCase,
    A.B.value('(Table)[1]', 'VARCHAR(MAX)' ) TableName
FROM    @WhereClause_XML.nodes('/NewDataSet/param') A(B) 
/*
XML DATA SAMPLE
<NewDataSet>
<param>
    <SearchField>EmpID</SearchField>
    <FilterCondition> >= </FilterCondition>
    <ConditionData>201</ConditionData>
    <MatchCase>0</MatchCase>
    <Table>Employee</Table>
</param>
<param>  
    <SearchField>DeptName</SearchField>
    <FilterCondition> = </FilterCondition>
    <ConditionData>AC01</ConditionData>
    <MatchCase>1</MatchCase>
    <Table>Department</Table>
</param>
<param>  
    <SearchField>Dob</SearchField>
    <FilterCondition> >= </FilterCondition>
    <ConditionData>20120104</ConditionData>
    <MatchCase>0</MatchCase>
    <Table>Employee</Table>
</param>
  </NewDataSet>'
  */

  CREATE PROCEDURE GenericSearch
  (
@WhereClause_XML XML,
@LogicalOperator VARCHAR(3)
  )
  AS

 BEGIN

 DECLARE @SearchField VARCHAR(255),
 @Operator VARCHAR(25),
 @ConditionData VARCHAR(MAX),
 @MatchCase BIT,
 @TableName VARCHAR(MAX),
 @Validity VARCHAR(100),
 @ColumnType VARCHAR(128),
 @ColumnPrecision INT,
 @ColumnScale INT,
 @ColumnNullable bit,
 @WhereClause VARCHAR(MAX)

 DECLARE @tbl_WhereClause AS TABLE 
 (
SearchField VARCHAR(255),
Operator VARCHAR(25),
ConditionData VARCHAR(MAX),
MatchCase BIT,
TableName VARCHAR(MAX),
Validity VARCHAR(100),
ColumnType VARCHAR(128),
ColumnPrecision INT,
ColumnScale INT,
ColumnNullable bit
 )


 INSERT INTO @tbl_WhereClause (SearchField, Operator, ConditionData,   MatchCase,TableName, 
 Validity, ColumnType, ColumnPrecision, ColumnScale, ColumnNullable)

SELECT  A.B.value('(SearchField)[1]', 'VARCHAR(255)' ) SearchField,
A.B.value('(FilterCondition)[1]', 'VARCHAR(25)' ) Operator,
A.B.value('(ConditionData)[1]', 'VARCHAR(MAX)' ) ConditionData,
A.B.value('(MatchCase)[1]', 'BIT' ) MatchCase,
A.B.value('(Table)[1]', 'VARCHAR(MAX)' ) TableName,
CASE WHEN t.NAME+c.NAME IS NULL THEN 'invalid' ELSE 'valid' END ,
ty.NAME,
c.PRECISION,
c.Scale,
c.Is_Nullable
FROM    @WhereClause_XML.nodes('/NewDataSet/param') A(B)
LEFT JOIN sys.tables t ON t.name = A.B.value('(Table)[1]', 'VARCHAR(MAX)' )
LEFT JOIN sys.COLUMNS c ON T.OBJECT_ID = c.OBJECT_ID AND c.name =     A.B.value('(SearchField)[1]', 'VARCHAR(255)' )
LEFT JOIN sys.types ty ON c.system_type_id = ty.system_type_id 

--SELECT * FROM @tbl_WhereClause

SET @WhereClause= 'WHERE 1=1'
DECLARE SearchCursor CURSOR FOR 
SELECT * FROM @tbl_WhereClause

OPEN SearchCursor

FETCH NEXT FROM SearchCursor 
INTO @SearchField,  @Operator,@ConditionData,@MatchCase,@TableName,@Validity,@ColumnType,@ColumnPrecision,@Colu    mnScale,@ColumnNullable

WHILE @@FETCH_STATUS = 0
BEGIN

IF CHARINDEX('INT', UPPER(@ColumnType)) > 0 
BEGIN
    SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) +  @SearchField + space(1)+@Operator+space(1)+@ConditionData
END
ELSE IF CHARINDEX('NUMERIC', UPPER(@ColumnType)) > 0 
BEGIN
    SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + @SearchField + space(1)+@Operator+space(1)+@ConditionData
END
ELSE IF CHARINDEX('BIT', UPPER(@ColumnType)) > 0 
BEGIN
    SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + @SearchField + space(1)+@Operator+space(1)+@ConditionData
END
ELSE IF CHARINDEX('DECIMAL', UPPER(@ColumnType)) > 0 
BEGIN
    SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + @SearchField + space(1)+@Operator+space(1)+@ConditionData
END
ELSE IF CHARINDEX('FLOAT', UPPER(@ColumnType)) > 0 
BEGIN
    SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + @SearchField + space(1)+@Operator+space(1)+@ConditionData
END
ELSE IF CHARINDEX('REAL', UPPER(@ColumnType)) > 0 
BEGIN
    SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + @SearchField + space(1)+@Operator+space(1)+@ConditionData
END
ELSE IF CHARINDEX('MONEY', UPPER(@ColumnType)) > 0 
BEGIN
    SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + @SearchField + space(1)+@Operator+space(1)+@ConditionData
END
ELSE IF CHARINDEX('DATE', UPPER(@ColumnType)) > 0 
BEGIN
    SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + 'CONVERT(varchar,'+@SearchField+',112)' +  space(1)+@Operator+'CONVERT(varchar,'''+@ConditionData+''',112)'
END
ELSE IF CHARINDEX('CHAR', UPPER(@ColumnType)) > 0 
BEGIN
    SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + @SearchField + space(1)+@Operator+''''+@ConditionData+''''
END 

FETCH NEXT FROM SearchCursor 
INTO @SearchField,  @Operator,@ConditionData,@MatchCase,@TableName,@Validity,@ColumnType,@ColumnPrecision,@ColumnScale,@ColumnNullable
    END

    CLOSE SearchCursor  
    DEALLOCATE SearchCursor 

    SELECT @WhereClause
    END
DECLARE @tbl_WhereClause AS TABLE (
    SearchField VARCHAR(255),
    Operator VARCHAR(25),
    ConditionData VARCHAR(MAX),
    MatchCase BIT
)

DECLARE @WhereClause_XML XML 
SET @WhereClause_XML = '
<NewDataSet>   
<param>   
<SearchField>EmployeeID</SearchField>   
<FilterCondition> &gt;= </FilterCondition>   
<ConditionData>201</ConditionData>   
<MatchCase>0</MatchCase>   
</param> 
<param>     
<SearchField>DeptID</SearchField>   
<FilterCondition> = </FilterCondition>   
<ConditionData>AC01</ConditionData>   
<MatchCase>0</MatchCase>   
</param>   
<param>     
<SearchField>Dob</SearchField>   
<FilterCondition> &lt;= </FilterCondition>   
<ConditionData>23-MAR-2010</ConditionData>   
<MatchCase>0</MatchCase>   
</param>   
</NewDataSet>'

INSERT INTO @tbl_WhereClause (SearchField, Operator, ConditionData, MatchCase)
SELECT  A.B.value('(SearchField)[1]', 'VARCHAR(255)' ) SearchField, 
        A.B.value('(FilterCondition)[1]', 'VARCHAR(25)' ) Operator, 
        A.B.value('(ConditionData)[1]', 'VARCHAR(MAX)' ) ConditionData,
        A.B.value('(MatchCase)[1]', 'BIT' ) ConditionData
FROM    @WhereClause_XML.nodes('/NewDataSet/param') A(B) 

SELECT * FROM @tbl_WhereClause