-1

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?

wjandrea
  • 28,235
  • 9
  • 60
  • 81
Fajela Tajkiya
  • 629
  • 2
  • 10
  • If you have snippet code already, you should show what you have. – Mark Jan 22 '23 at 03:20
  • Please write a more descriptive title, maybe something like, "How do I get a snippet to insert a character only if the user typed something?" Check out [ask] for tips on how to write a good title. – wjandrea Jan 22 '23 at 03:26
  • It'd help to make a [mre]. You can copy the one from my answer if you want. – wjandrea Jan 22 '23 at 03:33

2 Answers2

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:+.}
rioV8
  • 24,506
  • 3
  • 32
  • 49
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()
wjandrea
  • 28,235
  • 9
  • 60
  • 81