skip to Main Content

I have this snippet.

SELECT 'SELECT * FROM ' + OBJECT_SCHEMA_NAME(o.object_id, DB_ID(${20:})) + '.' + name,
       *
FROM ${20/$/./}sys.all_objects o
WHERE name LIKE '%${10:hadr}%'
ORDER BY o.name;

And this is how it works:

gif of usage of snippet

When the user types something in the function DB_ID(), I hope the content the user typed appears before sys.all_objects AND append an additional .. It already works like this as it shown in the above gif. However, I also hope if the user types nothing in the function DB_ID(), don’t add . before sys.all_objects. Is this possible?

2

Answers


  1. You can use lookbehind to assert that there’s something in that field: (?<=.)$. For a minimal example, let’s say this is the original snippet:

    foo($1); ${1/$/./}bar()
    

    Change it to:

    foo($1); ${1/(?<=.)$/./}bar()
    

    If I type something, e.g. x, then press Tab, I get:

    foo(x); x.bar()
    

    If I don’t type anything then press Tab, I get:

    foo(); bar()
    
    Login or Signup to reply.
  2. No need to add the : in field 2:

    DB_ID(${2})
    

    Use field 2

    ${2/(.*)/$1${1:+.}/}
    
    • capture all the typed text: (.*)
    • replace it with all the typed text: $1
    • followed by a . if the typed text is not empty: ${1:+.}
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search